我想从不同的线程调用一个普通的枚举器.当我做以下,
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.
>为什么Ruby设计为不允许跨线程调用枚举器(或光纤),以及
>有没有其他方法可以提供类似的功能?
我猜测枚举器/光纤上的操作的原子性在这里是相关的,但我不完全确定.如果这是问题,那么在使用时独占锁定枚举器/光纤将解决问题,我不知道为什么通常禁止跨线程调用枚举器/光纤.如果可以通过使用锁定来提供替代方案,那将满足我的需要.
解决方法
你可以使用
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