gpt4 book ai didi

stdout - 如何在 Raku 中截获 Proc::Async 的无缓冲输出?

转载 作者:行者123 更新时间:2023-12-03 18:33:34 25 4
gpt4 key购买 nike

有一个像

# 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 }'
我得到了想要的输出。
我知道 TTY IO::Handle objects are unbuffered , 在这种情况下 $*OUT产生的进程不是一个。我读过 IO::Pipe对象被缓冲“以便没有读取的写入不会立即阻塞”(尽管我不能说我完全理解这意味着什么)。
但无论我尝试了什么,我都无法获得 Proc::Async 的无缓冲输出流。我该怎么做呢?
我尝试使用 $proc.bind-stdout 绑定(bind)打开的 IO::Handle但我仍然遇到同样的问题。
请注意,执行类似 $proc.bind-stdout: $*OUT 的操作确实有效,因为 Proc::Async 对象不再缓冲,但这也不是我的问题的解决方案,因为我无法在输出消失之前利用它。它确实向我建议,如果我可以将 Proc::Async 绑定(bind)到一个无缓冲的句柄,它应该做正确的事情。但我也无法让它发挥作用。

澄清一下:正如 Perl 示例所建议的那样,我知道我可以通过禁用我将作为输入传递的命令的缓冲来解决这个问题,但我正在寻找一种从创建 Proc 的一侧执行此操作的方法: :异步对象。

最佳答案

您可以设置.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com