等待被杀死的Proc :: Async的Perl 6块

时间:2019-06-26 09:52:28

标签: perl6

我有一个perl6程序,该程序通过Proc::Async运行外部程序,并尝试读取其stdout。可能应该以某种方式读取标准输出的代码部分可能无法执行此操作,但是程序的其他部分实际上将终止外部进程以进行清理。但是,在杀死了这样的进程然后等待诺言之后,它会永远阻塞...,如何避免perl6在等待Proc::Async被管道输送但未被消耗的杀死stdout时阻塞?我认为以下代码段说明了问题所在:

#!/usr/bin/env perl6
#

my $proc = Proc::Async.new(<cat /dev/urandom>);
my $supply = $proc.stdout(:bin);
my $promise = $proc.start;

$proc.ready.then: {
    shell <<ps auxf | grep [u]random>>;
    put "Terminating process {$_.result} …";
    $proc.kill(SIGTERM);
}
sleep 1;
if shell(<<ps auxf | grep [u]random>>).exitcode ≠ 0 {
    put "processed killed!";
}

put "awaiting $proc ({$proc.command}) …";
await $promise;  # <--- blocked here :(

1 个答案:

答案 0 :(得分:7)

'myitem' + index返回的var obj = {}; $('.myitems').each(function(i) { obj['myitem' + i] = $(this).text(); }); 仅在任何获得的Promise输出流传递了所有事件后才保留。这意味着可以假设所有输出都在保留start时就已经交付了,这总体上大大简化了Supply的使用(如果没有这种行为,我们可能会看到很多错误的程序失去输出)。但是,如果从未使用过Promise,那么就不可能发生这种情况,因此挂起。

解决方案是Proc::Async Supply .tap而不提供任何回调:

stdout

这将简单地丢弃输出。