如何解决限制并发线程
| 我在通过sftp上传文件的程序中使用线程。可以上传的文件数量可能非常大或非常小。我希望能够同时上传5个或更少的文件,如果还有更多,请等待。我的理解通常是为此使用条件变量,但在我看来,一次只能允许一个线程。cv = ConditionVariable.new
t2 = Thread.new {
mutex.synchronize {
cv.wait(mutex)
upload(file)
cv.signal
}
}
我认为应该告诉它等待cv可用,完成后再发布它。我的问题是我如何才能一次允许超过1个同时仍限制数量?
编辑:我正在Windows中从1单击安装程序使用Ruby 1.8.7
解决方法
请改用ThreadPool。请参阅ThreadPool中的死锁(具体是可接受的答案)。
, 请注意-除非使用JRuby,否则Ruby中没有真正的并发。另外,除非您处于调试模式,否则线程中的异常将冻结主循环。
require \"thread\"
POOL_SIZE = 5
items_to_process = (0..100).to_a
message_queue = Queue.new
start_thread =
lambda do
Thread.new(items_to_process.shift) do |i|
puts \"Processing #{i}\"
message_queue.push(:done)
end
end
items_left = items_to_process.length
[items_left,POOL_SIZE].min.times do
start_thread[]
end
while items_left > 0
message_queue.pop
items_left -= 1
start_thread[] unless items_left < POOL_SIZE
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。