作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在VIDEO_URL
中,有数千个视频要下载。我想使用线程来完成这项工作,但一次最多只能使用十个线程。我如何重写以下代码来获取它?
VIDEO_URL.each do | video |
@workers << Thread.new{dl_video(video)}
end
@workers.each { |t| t.join }
gem的线程池好像工作线程超过10个就不会阻塞了,难道是I/O阻塞让线程池没有作用?
如果我在没有线程池的情况下下载视频,效果很好。
但是如果我用线程池下载视频,视频将不会被下载,当有 10 个 worker 时主线程应该被阻塞,但它没有。(每个视频应该至少有 1 分钟的下载时间)
MAX_WORKERS = 10
@pool = Thread.pool(MAX_WORKERS)
def dl_video(video)
File.open(video["title"], "wb") do |saved_file|
@pool.process{
saved_file.write open(video["link"], :allow_redirections => :safe).read
# saved_file.write(HTTParty.get(video["link"]).parsed_response)
}
end
end
最佳答案
您要实现的是一种经常使用的模式,它称为线程池。
我没试过,但也许threadpool gem 或类似的东西值得研究:
require "threadpool"
pool = ThreadPool.new(10)
VIDEO_URL.each{|video| pool.process{dl_video(video)}}
关于ruby - 如何限制并发线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30094947/
我是一名优秀的程序员,十分优秀!