условно динамический форк.
скрипт форкается, дети запускаются,
но через некоторое время зависает на waitpid и работа всех останавливается
Как можно обойтись без waitpid или как полечить?
$SIG{CHLD} = 'IGNORE';
while (my @fork_names_array = splice(@name_array_chunking, 1, PREFORK_CHILDREN+1)) {
for ($i = 0; $i <= PREFORK_CHILDREN; $i++) {
my $name = $fork_names_array[$i];if (defined($name) && $name) {
$name =~ s/["\r\n"]//g;
defined(my $pid = fork()) or warn "Can't fork: $!";
push(@childs, $pid);
if ($pid) {
# parent
} else {
# child's process here
$name;
do_child( $name );
exit 0;
}
}
foreach (@childs) {
my $tmp = waitpid($_, WNOHANG);
}
}
P.S. Может кто знает как сделать динамический форк? (я имею в виду скажем у нас есть 4 чилда, один завершился, система поняла что он завершился и форканула нового. Итого у нас постоянно 4 чилда весит)
February 21 2012, 11:12:45 UTC 3 months ago
Anonymous
February 21 2012, 11:36:05 UTC 3 months ago
Parallel::ForkManager?
February 21 2012, 17:17:49 UTC 3 months ago
February 21 2012, 14:56:03 UTC 3 months ago
И потом, я б не стал SIGCHLD игнорировать. Особенно - ДО fork.
February 21 2012, 17:17:23 UTC 3 months ago
February 21 2012, 18:35:27 UTC 3 months ago
Опять же если вспомнить матчасть, то waitpid(-1, flags) соглашается подхватить завершение любого из детей, кто завершится первым, и возвращает его pid. Это о том, как правильно делать конструкцию из ровно четырех детей. А почему waitpid с флагом WNOHANG решил задуматься - это вообще очень интимный вопрос, на нормальных юниксах он должен отрабатывать мгновенно. Для решения поставленной задачи как раз лучше подошло бы waitpid(-1, 0).
Приведенный же скрипт должен сразу после запуска всех PREFORK_CHILDREN деток немедленно (из-за WNOHANG) переходить к следующей итерации внешнего while.
February 22 2012, 04:18:26 UTC 3 months ago
February 21 2012, 19:31:09 UTC 3 months ago
February 22 2012, 04:17:27 UTC 3 months ago
February 21 2012, 23:27:59 UTC 3 months ago
February 24 2012, 11:48:15 UTC 3 months ago
Домой приду скину пример.
February 24 2012, 15:20:27 UTC 3 months ago
http://perldoc.perl.org/perlipc.htm
Как-то так должно выглядеть:
http://pastebin.com/547T9jBc
February 25 2012, 11:01:51 UTC 3 months ago
February 25 2012, 13:46:15 UTC 3 months ago
http://ru-perl.livejournal.com/408887.h