我有一个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 :(
Run Code Online (Sandbox Code Playgroud)
在Promise从返回start是只保留任何一次获得Supply的输出流的已经交付其所有活动。这意味着可以假设所有输出都在Promise保留时就已经交付了,这总体上大大简化了工作Proc::Async(如果没有这种行为,我们可能会看到大量错误的程序丢失了输出)。但是,如果Supply永远不要窃听,那么就不可能发生这种情况,因此挂起。
解决的办法是.tap在stdout Supply没有提供任何的回调:
$proc.stdout(:bin).tap;
Run Code Online (Sandbox Code Playgroud)
这将简单地丢弃输出。