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

使用带超时的多线程时,ruby Open3.capture3中的封闭流(IOError),ruby,timeout,popen,popen3,Ruby,Timeout,Popen,Popen3,我希望运行几个系统命令,并获得以下结果: 我希望在同一进程的不同线程中运行每个命令 我希望捕获并存储输出和退出状态 我希望在执行时间上设置超时,以确定某个系统命令是否被卡住 不幸的是,以下代码的结尾是: /usr/lib/ruby/1.9.1/open3.rb:276:inread”:封闭流(IOError) from/usr/lib/ruby/1.9.1/open3.rb:276:in capture3' 有时,取决于线程调度。 例如,当将超时更改为2秒(或完全删除超时块)时,代码可以工作 下

我希望运行几个系统命令,并获得以下结果:

  • 我希望在同一进程的不同线程中运行每个命令
  • 我希望捕获并存储输出和退出状态
  • 我希望在执行时间上设置超时,以确定某个系统命令是否被卡住
  • 不幸的是,以下代码的结尾是:

    /usr/lib/ruby/1.9.1/open3.rb:276:in
    read”:封闭流(IOError)
    from/usr/lib/ruby/1.9.1/open3.rb:276:in
    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
    
    我曾试图从
    方法的output\u中
    营救
    ,并关闭o,但也没有效果。 我感觉线程以某种方式共享popen3实现中的管道或某些变量