我想从不同的线程调用一个普通的枚举器。当我执行以下操作时,
enum = (0..1000).to_enum
t1 = Thread.new do
p enum.next
sleep(1)
end
t2 = Thread.new do
p enum.next
sleep(1)
end
t1.join
t2.join
它引发了一个错误:
Fiber called across threads.
enum
从t2
调用t1
后调用{{1}}。
我猜测枚举器/光纤上的操作的原子性在这里是相关的,但我不完全确定。如果这是问题,那么在使用时独占锁定枚举器/光纤将解决问题,我不知道为什么通常禁止跨线程调用枚举器/光纤。如果可以通过使用锁定来提供替代方案,那将满足我的需要。
答案 0 :(得分:1)
您可以使用Queue
queue = Queue.new
(0..1000).map(&queue.method(:push))
t1 = Thread.new do
while !queue.empty?
p queue.pop(true)
sleep(0.1)
end
end
t2 = Thread.new do
while !queue.empty?
p queue.pop(true)
sleep(0.1)
end
end
t1.join
t2.join