我是初学者,试图研究多线程和消费者 - 生产者模式。作为一个简单的测试,我试着写一些输出数字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.我无法理解为什么,逻辑对我来说都是合理的。
答案 0 :(得分:0)
您必须循环使用者线程。默认情况下,线程不会遍历传递的代码块。
consumer = Thread.new do
while queue.empty? == false
item = queue.pop(true)
Thread.exit if item == "done"
item.call
end
end