|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : vilfred 2:5020/400 29 Aug 2001 21:10:57 To : Zair Subject : Re: Hесколько процессов. -------------------------------------------------------------------------------- Привет еще раз, 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 [Маньяки] -- Отправлено через сервер Talk.Ru - http://www.talk.ru --- ifmail v.2.15dev5 * Origin: Talk.ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6488afda298b.html, оценка из 5, голосов 10
|