我知道你可以在ruby中做这样的事情,
download_process = IO.popen "wget #{goodies}"
download_process.wait
puts "goodies gotten"
生成子进程并在完成时进行响应。
但是,说我希望在等待子进程完成时让我的脚本忙于其他任务,然后定期检查是否有任何子进程已经完成。我将如何在ruby中执行此操作?
我的目标是拥有n个同时下载线程,由单个ruby线程管理,该线程还清理并处理下载的数据文件(因此在处理文件后,它会检查有多少完整下载的文件正在等待并决定下载线程的数量相应地产卵。)
答案 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