gpt4 book ai didi

ruby - 如何限制并发线程数

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:24 39 4
gpt4 key购买 nike

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/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com