我正在查看
这个模块中的示例代码(只调用一个子进程)存在问题。我只是向代码添加了一个简单的睡眠功能,以免立即返回,但父进程立即退出而不等待子进程。
结果是
AnyEvent::Fork
模块。我有20个外部脚本需要并行调用(每次6个),并在所有脚本执行完毕后总结它们的输出。我不知道如何实现。这个模块中的示例代码(只调用一个子进程)存在问题。我只是向代码添加了一个简单的睡眠功能,以免立即返回,但父进程立即退出而不等待子进程。
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
的事实很有趣。也许它并不表示进程的结束。 - ikegamiAnyEvent->condvar
不同的API吗?在运行您的代码后,我发现在5秒后“hi”出现在/tmp/log
中。您对测试脚本的预期行为是什么? - G. Cito