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


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)
 
 

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

 Тема:    Автор:    Дата:  
 Re: Hесколько процессов.   vilfred   29 Aug 2001 21:10:57 
Архивное /ru.perl/6488afda298b.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional