在Popen阻止呼叫

时间:2011-05-01 03:54:09

标签: ruby

pipe = IO.popen('./myblockingprogram')
while line = pipe.gets
  puts "hello world"
end

其中myblockingprogram是一个阻塞的程序,直到它通过网络接收数据,然后它将一些文本打印到stdout。从bash直接测试运行它很有效。

然而,当我运行上面的程序时,我从未看到任何“hello world”行打印到stdout(控制台)。我错了,popen启动了一个全新的进程...因此,即使它进行了阻塞调用,它也不应该阻止主ruby程序由于某些全局解释器锁而运行?

有没有更好的方法来构建这样的程序,我想读取另一个程序输出的文本行并以某种方式处理结果(没有终止条件,它可能永远运行)?

2 个答案:

答案 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需要很长时间,则可能必须使用异步技术来防止长时间阻塞。