【发布时间】:2015-07-17 15:57:18
【问题描述】:
在VIDEO_URL,有成千上万的视频可供下载。我想使用线程来完成这项工作,但一次最多只能使用十个线程。怎样重写下面的代码才能得到呢?
VIDEO_URL.each do | video |
@workers << Thread.new{dl_video(video)}
end
@workers.each { |t| t.join }
更新
gem的线程池在工作线程超过10个后好像没有阻塞,是不是让线程池的I/O阻塞没有效果?
如果我下载没有线程池的视频,效果很好。
但是如果我用线程池下载视频,视频将不会被下载,当有 10 个工作人员时主线程应该被阻塞,但它没有。 (每个视频至少有 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
【问题讨论】:
标签: ruby multithreading threadpool