【发布时间】:2016-11-17 06:43:47
【问题描述】:
是否有一种简单、可靠的方法来判断 IPC::Run 任务何时完成,即任何子进程已退出?
文档对此保持沉默。
似乎在pumpable 上循环是可行的,尽管它并没有真正清楚地记录为正确的做事方式:
use strict;
use warnings;
use IPC::Run;
use 5.12.0;
my $handle = IPC::Run::start(['sleep', '10']);
while ($handle->pumpable)
{
sleep(0.5);
# do other stuff in the event loop
# so we don't want to block on finish
}
$handle->finish;
print("exited with '" . $handle->result . "'");
还有更好的选择吗? finish 阻塞,但是在等待 proc 完成时,您无法在事件循环中执行其他工作。
我很惊讶没有一个简单的
$handle->running
或
$handle->finished
我是否遗漏了一些明显的东西?
同样,似乎没有记录的方式来获取孩子的 pid。
【问题讨论】:
-
$handle->finish块,如wait。如果你想在等待之前检查,调用resultbefore child completed 显然会抛出一个异常,所以你可以通过检查异常来使用它——eval { $res = $handle->result } or print "Still running\n";。这是一个杂物(应该检查$@而不是or-it),但是这样可以吗?result还有许多其他版本。还有一个signal,我试图发送一个0,但什么也没回。文档中似乎暗示不能直接使用 pid。 -
呃。是的,可以尝试调用
result并捕获异常。丑陋的:(。我应该明确表示我正在寻找一种非阻塞方式,否则我只会使用IPC::Run::run。谢谢。 -
对,我确实明白了,但提到阻止以防万一。丑陋,但我现在看不到更清洁的方式。 (这个模块我用的不多。我会多看看,因为我一直想更好地检查它。)
-
它非常有用,强烈推荐。这是我唯一的问题,以及它明显决定隐藏子进程的 pid。
-
因此,击败封装不是一个好方法,但是:当您执行
Dumper($handle)时,您将看到对象数据。 (需要use Data::Dumper;。)由此,我们可以得到$handle->{KIDS}[0]{PID}的pid。那是给第一个孩子的。这个和result的异常技巧可以包裹在 subs 中,以减轻一点痛苦。
标签: perl perl-ipc-run