Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: мЕЯЙHКЭЙH ОПHЖЕЯЯHБ   Zair   30 Aug 2001 13:34:17 
Архивное /ru.perl/883591bbeb9f1.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional