如何检查ruby子进程是否已经完成而没有等待

时间:2013-12-14 16:28:59

标签: ruby scripting popen

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

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

生成子进程并在完成时进行响应。

但是,说我希望在等待子进程完成时让我的脚本忙于其他任务,然后定期检查是否有任何子进程已经完成。我将如何在ruby中执行此操作?

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

2 个答案:

答案 0 :(得分:1)

对于这种情况,请使用包含在Thread中的块的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

答案 1 :(得分:1)

&#34;无需等待&#34; usualy意味着你应该在另一个线程中运行它。请尝试阅读: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