我在通过sftp上传文件的程序中使用线程。可以上传的文件数可能非常大或非常小。我希望能够有5个或更少的同步上传,如果有更多让他们等待。我的理解通常是一个条件变量将用于此,但在我看来,这样一次只允许1个线程。
cv = ConditionVariable.new
t2 = Thread.new {
mutex.synchronize {
cv.wait(mutex)
upload(file)
cv.signal
}
}
我认为应该告诉它等待cv可用,完成后释放它。我的问题是我怎么能这样做,允许一次超过1,同时仍然限制数量?
编辑:我在Windows上使用Ruby 1.8.7从单击安装程序
答案 0 :(得分:2)
请改用ThreadPool。请参阅Deadlock in ThreadPool(特别是接受的答案)。
答案 1 :(得分:1)
提醒一句 - 除非您使用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