作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个像
# Contents of ./run
my $p = Proc::Async.new: @*ARGS;
react {
whenever Promise.in: 5 { $p.kill }
whenever $p.stdout { say "OUT: { .chomp }" }
whenever $p.ready { say "PID: $_" }
whenever $p.start { say "Done" }
}
像这样执行
./run raku -e 'react whenever Supply.interval: 1 { .say }'
我希望看到类似的东西
PID: 1234
OUT: 0
OUT: 1
OUT: 2
OUT: 3
OUT: 4
Done
但相反,我看到
PID: 1234
OUT: 0
Done
我知道这与缓冲有关:如果我将该命令更改为类似
# The $|++ disables buffering
./run perl -E '$|++; while(1) { state $i; say $i++; sleep 1 }'
我得到了想要的输出。
$*OUT
产生的进程不是一个。我读过
IO::Pipe对象被缓冲“以便没有读取的写入不会立即阻塞”(尽管我不能说我完全理解这意味着什么)。
$proc.bind-stdout
绑定(bind)打开的 IO::Handle但我仍然遇到同样的问题。
$proc.bind-stdout: $*OUT
的操作确实有效,因为 Proc::Async 对象不再缓冲,但这也不是我的问题的解决方案,因为我无法在输出消失之前利用它。它确实向我建议,如果我可以将 Proc::Async 绑定(bind)到一个无缓冲的句柄,它应该做正确的事情。但我也无法让它发挥作用。
最佳答案
您可以设置.out-buffer
句柄(例如 $*OUT
或 $*ERR
)到 0:
$ ./run raku -e '$*OUT.out-buffer = 0; react whenever Supply.interval: 1 { .say }'
PID: 11340
OUT: 0
OUT: 1
OUT: 2
OUT: 3
OUT: 4
Done
关于stdout - 如何在 Raku 中截获 Proc::Async 的无缓冲输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63486337/
我是一名优秀的程序员,十分优秀!