【问题标题】:How to check to see if ruby child process has completed without waiting如何检查ruby子进程是否已完成而无需等待
【发布时间】:2013-12-14 16:28:58
【问题描述】:

我知道你可以在 ruby​​ 中做这样的事情,

download_process = IO.popen "wget #{goodies}"
download_process.wait
puts "goodies gotten"

产生一个子进程并在它完成时做出响应。

但是,说 我想让我的脚本在等待子进程完成的同时忙于其他任务,然后定期检查是否有任何子进程已经完成。我将如何在 ruby​​ 中做到这一点?

我的目标是同时拥有 n 个下载线程,由单个 ruby​​ 线程管理,该线程还清理和处理下载的数据文件(因此在处理文件后,它会检查有多少完整下载的文件正在等待并决定有多少下载线程相应地产生)。

【问题讨论】:

    标签: ruby scripting popen


    【解决方案1】:

    对于这种情况,使用 IO.popen 和包裹在线程中的块。为这个工作示例添加了 -q 选项:

    file1 = "http://www.vim.org/scripts/download_script.php?src_id=7701"
    file2 = "http://www.openss7.org/repos/tarballs/strx25-0.9.2.1.tar.bz2"
    threads = []
    
    threads << Thread.new do
     IO.popen("wget -q   #{file1}"){ |io| io.read}
    end
    
    threads << Thread.new do
      IO.popen("wget -q  #{file2}"){ |io| io.read }
    end
    
    while true
      sleep(2)
      threads.each_with_index do |tr, index|
        if tr.alive?
          puts "Downloading in \##{index}"
        else
          puts "Downloaded in \##{index}"
          threads[index]  = Thread.new do
            IO.popen("wget -q   #{file1}"){ |io| io.read}
          end
        end
      end
    end
    

    【讨论】:

      【解决方案2】:

      “无需等待”通常意味着您应该在另一个线程中运行它。尝试阅读:http://ruby-doc.org/core-2.0.0/Thread.html

      您的代码必须是这样的:

      download_process = Thread.new { IO.popen "wget #{goodies}" }
      puts 'Goodies gotten'
      

      当你想检查线程状态时,使用alive函数:

      download_process.alive? #=> true/false
      

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 2021-11-08
        • 2021-07-28
        • 2017-05-20
        • 2021-07-13
        • 2013-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多