检查使用Open3::popen3
打开的流程是否已停止的正确方法是什么?我正在管理一个对进程有错误的大文件,需要尽快停止,最好每次循环迭代消耗最少的资源。程序基本上就是这样的
# launcher.rb
require 'open3'
Open3.popen3('ruby', 'consumer.rb') do |i, o, e, w|
5.times do |n|
i.puts(n)
puts "line #{n}"
end
puts "Errors: #{e.read}"
end
# consumer.rb
i = 0
ARGF.each_line do |line|
if i == 2
$stderr.write('error')
exit(1)
end
i+=1
end
答案 0 :(得分:3)
popen3
返回一个数组,第四个元素是一个线程对象:
prc = Open3.popen3('sleep 10')
=> [#<IO:fd 10>, #<IO:fd 12>, #<IO:fd 14>, #<Thread:0x007f84b49c8480 sleep>]
正如您所见,线程本身显示状态,10秒后它将是:
=> [#<IO:fd 16>, #<IO:fd 18>, #<IO:fd 20>, #<Thread:0x007f84b437d120 dead>]
因此,要检查流程状态,您需要调查thread.status
,如果流程正在运行,则run
或sleep
,false
或{{1}如果过程完成(假)或死亡(无):
nil
几秒后:
prc = Open3.popen3('sleep 10')
=> [#<IO:fd 10>, #<IO:fd 12>, #<IO:fd 14>, #<Thread:0x007f84b49c8480 sleep>]
prc[3].status
=> "sleep"