Я смотрю на модуль AnyEvent::Fork
. У меня есть 20 внешних скриптов, которые я хотел бы вызывать параллельно (по 6 за раз) и обобщать их вывод позже, когда все будет готово. Я в недоумении, как этого добиться.
Пример кода (который вызывает только 1 дочерний элемент) в модуле имеет проблему. Я просто добавляю в код простой сон, чтобы не возвращаться сразу, и родитель сразу выходит, не дожидаясь дочернего процесса.
open my $output, ">/tmp/log" or die "$!";
AnyEvent::Fork
->new
->eval ('
# compile a helper function for later use
sub run {
my ($fh, $output, @cmd) = @_;
# perl will clear close-on-exec on STDOUT/STDERR
open STDOUT, ">&", $output or die;
open STDERR, ">&", $fh or die;
### Added by me to demonstrate that
### $cv->recv returns immediately.
sleep 5;
exec @cmd;
}
')
->send_fh ($output)
->send_arg ("/bin/echo", "hi")
->run ("run", my $cv = AE::cv);
my $stderr = $cv->recv;
В результате /tmp/log
пусто. Я не понимаю, как здесь используется condvar
, этого нет в документации. Могу ли я получить количество бегущих детей, используя condvar
?
Пожалуйста, помогите, как сделать это правильно.
ОБНОВЛЕНИЕ Основная проблема здесь заключается в том, что родитель не ждет завершения дочернего процесса.
$stderr
. Возможно, это не сигнализирует об окончании процесса.) - person ikegami   schedule 26.11.2014run
для запуска. Извините, я не знаю, как использовать этот модуль, и у меня нет времени, чтобы выяснить это прямо сейчас. - person ikegami   schedule 26.11.2014AnyEvent->condvar
? Здесь при запуске вашего кода у меня появляется/tmp/log
через 5 секунд. Какого поведения вы ожидаете от тестового сценария? - person G. Cito   schedule 26.11.2014-Dusethreads=y
...for ((i = 0; i < 42; i++)) ; do perl ae-fork.pl ;done
Используя ваш код, но с переключением">>/tmp/log"
и("/bin/echo", "hi from $$")
... я получаю файл журнала из 42 строк с PID - person G. Cito   schedule 26.11.2014/tmp/log
не будет пустым, если вы подождете 5 секунд. - person ikegami   schedule 27.11.2014->run()
? - person G. Cito   schedule 17.12.2014