使用带有超时的多线程时,ruby Open3.capture3中的封闭流(IOError)

时间:2014-04-27 17:20:34

标签: ruby timeout popen popen3

我希望运行多个系统命令,并获得以下内容:

  1. 我希望在同一进程下运行不同线程中的每个命令
  2. 我希望捕获并存储输出和退出状态。
  3. 我希望在执行时间设置超时,以查找某个系统命令是否卡住。
  4. 不幸的是,以下代码最终会出现:

      

    /usr/lib/ruby/1.9.1/open3.rb:276:in read': closed stream (IOError) from /usr/lib/ruby/1.9.1/open3.rb:276:in阻止(2级)   capture3'

    偶尔会依赖于线程调度。 例如,当将超时更改为2秒(或完全删除超时块)时,代码可以正常工作。

    以下是示例代码:

    require 'open3'
    require 'timeout'
    
    def output_from(command)
      o, e, s = Open3.capture3(command)
      return o
    end
    
    attempts = 0
    Thread.abort_on_exception = true
    for i in 0..5
      Thread.new {
        begin
          Timeout::timeout(0.0001) {
            output = output_from('cat /proc/cpuinfo')
          }
        rescue Timeout::Error => e
          attempts+=1
          retry unless attempts > 2
        end
      }
    end
    
    puts attempts
    

    我曾在rescue方法尝试output_from并关闭o,但也没有帮助。 我觉得线程以某种方式共享管道或popen3实现中的一些变量。

0 个答案:

没有答案