pipe = IO.popen('./myblockingprogram')
while line = pipe.gets
puts "hello world"
end
其中myblockingprogram
是一个阻塞的程序,直到它通过网络接收数据,然后它将一些文本打印到stdout。从bash直接测试运行它很有效。
然而,当我运行上面的程序时,我从未看到任何“hello world”行打印到stdout(控制台)。我错了,popen启动了一个全新的进程...因此,即使它进行了阻塞调用,它也不应该阻止主ruby程序由于某些全局解释器锁而运行?
有没有更好的方法来构建这样的程序,我想读取另一个程序输出的文本行并以某种方式处理结果(没有终止条件,它可能永远运行)?
答案 0 :(得分:2)
确保myblockingprogram在写入stdout时刷新输出缓冲区。
一个简单的例子myblockingprogram是:
#!/bin/ruby
100.times do
sleep 10
$stdout.puts "Hello World"
$stdout.flush
end
在没有flush命令的情况下,在子进程完成之前,您不会看到管道的任何结果。使用flush命令,您将看到子进程的中间结果。
答案 1 :(得分:1)
我认为你必须确保Ruby方面和popen-ed进程“合作”并且不要互相阻塞。如果运行myblockingprogram需要很长时间,则可能必须使用异步技术来防止长时间阻塞。