|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Zair 2:5020/52 29 Aug 2001 20:39:22 To : All Subject : Re: мЕЯЙHКЭЙH ОПHЖЕЯЯHБ. -------------------------------------------------------------------------------- <dmitriy@genphys.phys.msu.su> wrote: >Zair <Zair@f52.n5020.z2.fidonet.org> пишет: > >> Hi, all! > >> Люди, а как запросить одновременно несколько >> документов по HTTP, что б >> они принимались паралельно? > >Короче, работающий скрипт имеет номер в $$. только один, пока документ >не загрузился, следующий не будет грузицца, потому как $$ уникально. >Может быть можно сделать так, чтобы скрипт сам себя плодил, т.е. >запускать скрипт из себя по числу нужных одновременных подкачек. > Сделал так: #!/usr/bin/perl use Symbol; use POSIX; # Глобальные переменные $PREFORK =5; # Количество поддерживаемых потомков %children =(); # Ключами являются текущие идентификаторы процессов-потомков $children =0; # Текущее число потомков $i=0; # Текущий процесс @URL=('http://www.onsitetrading.ru','http://www.yahoo.com','http://www.briefing. com''); # Создать потомков. for $i (1 .. $PREFORK) { make_new_child(); } # Установить обработчики сигналов. $SIG{CHLD} = \&REAPER; $SIG{INT} = \&HUNTSMAN; # Ждем завершения всех процессов. while ($children>0) { sleep; # Ждать сигнала (например, смерти потомка). } exit; sub REAPER { # Чистка мертвых потомков $SIG{CHLD} = \&REAPER; my $pid = wait; $children --; delete $children{$pid}; } # sub REAPER sub HUNTSMAN { # Обработчик сигнала SIGINT local($SIG{CHLD}) = 'IGNORE'; # Убиваем своих потомков kill 'INT' => keys %children; exit; # Корректно завершиться } # sub HUNTSMAN sub make_new_child { my $pid; my $sigset; # Блокировать сигнал для fork. $sigset = POSIX::SigSet->new(SIGINT); sigprocmask(SIG_BLOCK, $sigset) or die "Can't block SIGINT for fork: $!\n"; die "fork: $!" unless defined ($pid = fork); if ($pid) { # Родитель запоминает рождение потомка и возвращается, sigprocmask(SIG_UNBLOCK, $sigset) or die "Can't unblock SIGINT for fork: $!\n"; $children{$pid} = 1; $children++; return; } else { # Потомок *не может* выйти из этой подпрограммы. $SIG{INT} = 'DEFAULT'; # Пусть SIGINT убивает процесс, # как это было раньше. # Разблокировать сигналы sigprocmask(SIG_UNBLOCK, $sigset) or die "Can't unblock SIGINT for fork: $!\n"; GetURL (@URL[$i]); exit; } } sub GetURL { ..... } Все нормально работает... но только под UNIX'aми. >Хотя проц делает одну задачу, потом другую, потом третью. И никогда >одновременно 2 задачи. если 2 проца, то можна. А если 1? >или я не прав? > >> With best gerards... Zair --- Forte Agent 1.8/32.553 * Origin: Zenon N.S.P. news server (2:5020/52.0) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/8310674bd3630.html, оценка из 5, голосов 10
|