agent-0007 ([info]agent_0007) wrote in [info]ru_perl,

fork по непонятным причинам вешается

Изначально есть большой массив с именами. Его чанкаем, и начинаем 
условно динамический форк.

скрипт форкается, дети запускаются,
но через некоторое время зависает на 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 чилда весит)

  • Post a new comment

    Error

    Your IP address will be recorded 

  • 14 comments

[info]agent_0007

February 21 2012, 11:12:45 UTC 3 months ago

Коммент поймал, штука интересная, пойду изучать ;)

Anonymous

February 21 2012, 11:36:05 UTC 3 months ago

>P.S. Может кто знает как сделать динамический форк? (я имею в виду скажем у нас есть 4 чилда, один завершился, система поняла > что он завершился и форканула нового. Итого у нас постоянно 4 чилда весит)

Parallel::ForkManager?

[info]agent_0007

February 21 2012, 17:17:49 UTC 3 months ago

щас пробую переписывыаю под него ;)

[info]besm6

February 21 2012, 14:56:03 UTC 3 months ago

Операционка, часом, не винда? А то под виндой fork, конечно, эмулируется, но хреново...

И потом, я б не стал SIGCHLD игнорировать. Особенно - ДО fork.

[info]agent_0007

February 21 2012, 17:17:23 UTC 3 months ago

Не винда ;) То есть выставлять SIGCHLD в чилде?

[info]besm6

February 21 2012, 18:35:27 UTC 3 months ago

Вообще если вспомнить матчасть, то умолчательная реакция на SIGCHLD - как раз IGNORE, так что в IGNORE его выставлять не надо.

Опять же если вспомнить матчасть, то waitpid(-1, flags) соглашается подхватить завершение любого из детей, кто завершится первым, и возвращает его pid. Это о том, как правильно делать конструкцию из ровно четырех детей. А почему waitpid с флагом WNOHANG решил задуматься - это вообще очень интимный вопрос, на нормальных юниксах он должен отрабатывать мгновенно. Для решения поставленной задачи как раз лучше подошло бы waitpid(-1, 0).

Приведенный же скрипт должен сразу после запуска всех PREFORK_CHILDREN деток немедленно (из-за WNOHANG) переходить к следующей итерации внешнего while.

[info]agent_0007

February 22 2012, 04:18:26 UTC 3 months ago

спасибо за разъяснения! буду пробовать.

[info]_apm_

February 21 2012, 19:31:09 UTC 3 months ago

может coro? и забыть про pid

[info]agent_0007

February 22 2012, 04:17:27 UTC 3 months ago

А что есть coro ?

[info]nm_work

February 21 2012, 23:27:59 UTC 3 months ago

Посмотрите еще Parallel::Iterator :) очень забавная штюка :)

[info]dim0xff

February 24 2012, 11:48:15 UTC 3 months ago

смотреть в сторону sleep без аргументов в вечном цикле.

Домой приду скину пример.

[info]dim0xff

February 24 2012, 15:20:27 UTC 3 months ago

это я про "P.S. Может кто знает как сделать динамический форк? (я имею в виду скажем у нас есть 4 чилда, один завершился, система поняла что он завершился и форканула нового. Итого у нас постоянно 4 чилда весит) "

http://perldoc.perl.org/perlipc.html

Как-то так должно выглядеть:
http://pastebin.com/547T9jBc

[info]agent_0007

February 25 2012, 11:01:51 UTC 3 months ago

Ок, буду ждать, ForkManaager тоже вешается((

[info]dim0xff

February 25 2012, 13:46:15 UTC 3 months ago

я ещё вчера ответил))
http://ru-perl.livejournal.com/408887.html?thread=4669239#t4669239
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…