我有一个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 :(
答案 0 :(得分:7)
从'myitem' + index
返回的var obj = {};
$('.myitems').each(function(i) {
obj['myitem' + i] = $(this).text();
});
仅在任何获得的Promise
输出流传递了所有事件后才保留。这意味着可以假设所有输出都在保留start
时就已经交付了,这总体上大大简化了Supply
的使用(如果没有这种行为,我们可能会看到很多错误的程序失去输出)。但是,如果从未使用过Promise
,那么就不可能发生这种情况,因此挂起。
解决方案是Proc::Async
Supply
.tap
而不提供任何回调:
stdout
这将简单地丢弃输出。