为什么我的消费者 - 生产者设置只输出第一项?

时间:2014-10-26 08:35:09

标签: ruby multithreading

我是初学者,试图研究多线程和消费者 - 生产者模式。作为一个简单的测试,我试着写一些输出数字1到500的东西。这就是我写的。

array = [*1..500]

queue = SizedQueue.new(5)

p1 = Thread.new do
  array.each do |n|
    queue << lambda {
      puts n
    }
  end
  queue << "done"
end

consumer = Thread.new do
  item = queue.pop(true)
  Thread.exit if item == "done"
  item.call
end

consumer.join

所以我有一个数组[1,2,3,4...],以及一个适合5项的队列。对于数组中的每个项目,我向队列添加一个lambda,它将输出该项目,最后是值“done”。

然后我开始消费者。我从队列中得到一个项目。如果它“完成”,那么我结束程序。如果不是,那么它必须是我的数字输出lambdas之一,所以我称之为。

但输出只是1。一个数字1.我无法理解为什么,逻辑对我来说都是合理的。

1 个答案:

答案 0 :(得分:0)

您必须循环使用者线程。默认情况下,线程不会遍历传递的代码块。

consumer = Thread.new do
    while queue.empty? == false
      item = queue.pop(true)
      Thread.exit if item == "done"
      item.call
    end  
end