限制并发线程

时间:2011-06-14 15:15:01

标签: ruby multithreading

我在通过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从单击安装程序

2 个答案:

答案 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