|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Zair 2:5020/52 30 Aug 2001 13:34:17 To : All Subject : Re: мЕЯЙHКЭЙH ОПHЖЕЯЯHБ -------------------------------------------------------------------------------- http://www.inf.ethz.ch/~langhein/ParallelUA/ On Wed, 29 Aug 2001 21:10:57 +0400, vilfred <dmitriy@genphys.phys.msu.su> wrote: >Привет еще раз, Zair! > >я имел ввиду нечто вроде > >a.pl: > >#!/usr/bin/perl >use CGI 'param'; >use LWP::Simple; >if($ENV{'QUERY_STRING'} eq ''){ > @urls=($url1, $url2, $url3,$url4); > foreach(@urls){#вызовем a.pl из самого себя несколько раз > `a.pl urls=$_ &`; #запуск скрипта в фоновом режиме > } >} >unless($ENV{'QUERY_STRING'} eq ''){ > $url=param('urls'); > $page=get "$url"; > open F, ">>file$$.html"; > print F $page; > close F; >} >#работает под юникс, хотя можно и под win > >Если задача синхронизировать запись на диск, то я такого >не делал еще... > >Дима > >> Сделал так: > >> #!/usr/bin/perl >> use Symbol; >> use POSIX; >> # Глобальные переменные >> $PREFORK =5; # Количество поддерживаемых потомков > >> %children =(); # Ключами являются текущие >> идентификаторы >> процессов-потомков >> $children =0; # Текущее число потомков >> $i=0; # Текущий процесс > >> # Создать потомков. >> 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ми. > > >TEAM [Маньяки] --- Forte Agent 1.8/32.553 * Origin: Zenon N.S.P. news server (2:5020/52.0) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/883591bbeb9f1.html, оценка из 5, голосов 10
|