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


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)
 
 

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

 Тема:    Автор:    Дата:  
 Re: мЕЯЙHКЭЙH ОПHЖЕЯЯHБ.   Zair   29 Aug 2001 20:39:22 
 Re: мЕЯЙHКЭЙH ОПHЖЕЯЯHБ.   Artem Chuprina   31 Aug 2001 09:58:37 
Архивное /ru.perl/8310674bd3630.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional