Проблемы при создании многопроцессорной задачи в Perl - PullRequest
1 голос
/ 27 октября 2010

Я пытаюсь сделать основную многопроцессорную задачу, и это то, что у меня есть.Прежде всего, я не знаю, как сделать эту программу неблокирующим процессом, потому что, когда я жду ответа дочернего элемента (с waitpid), другие процессы также должны ждать в очереди., но что произойдет, если некоторые дочерние процессы умирают раньше (я имею в виду, процессы умирают в беспорядке)?Итак, я искал, и мне кажется, что я могу получить PID процесса, который только что умер, для этого я использую waitpid(-1, WNOHANG).Я всегда получаю предупреждение, что WNOHANG - это не число, но когда я добавил библиотеку sys_wait_h, я не получил эту ошибку, но скрипт никогда не ждет PID, что может быть ошибкой?


#!/usr/bin/perl
#use POSIX ":sys_wait_h"; #if I use this library, I dont get the error, but it wont wait for the return of the child
use warnings;

main(@ARGV);

sub main{
 my $num = 3;
 for(1..$num){
  my $pid = fork();
  if ($pid) {
   print "Im going to wait (Im the parent); my child is: $pid\n";
   push(@childs, $pid);
  } 
  elsif ($pid == 0) {
   my $slp = 5 * $_;
   print "$_ : Im going to execute my code (Im a child) and Im going to wait like $slp seconds\n";
   sleep $slp;
   print "$_ : I finished my sleep\n";
   exit(0);
  } 
  else {
   die "couldn’t fork: $!\n";
  } 
 }

 foreach (@childs) {
  print "Im waiting for: $_\n";
  my $ret = waitpid(-1, WNOHANG);
  #waitpid($_, 0);
  print "Ive just finish waiting for: $_; the return: $ret \n";
 }
}

Заранее спасибо, пока!

Ответы [ 2 ]

3 голосов
/ 27 октября 2010

Если вы используете WNOHANG, процесс не заблокируется, если ни один из дочерних элементов не был прерван.В этом смысл WNOHANG;это гарантирует, что waitpid () вернется быстро.В вашем случае, похоже, что вы хотите просто использовать wait () вместо waitpid ().

0 голосов
/ 27 октября 2010

Я считаю, что POE довольно хорошо справляется со всем этим. Это асинхронное (неблокирующее) управление всеми видами вещей, включая внешние процессы. Вам не нужно разбираться со всеми вещами низкого уровня, потому что POE сделает это за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...