跨线程共享枚举器

时间:2014-02-23 09:35:50

标签: ruby multithreading enumerator

我想从不同的线程调用一个普通的枚举器。当我执行以下操作时,

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.

enumt2调用t1后调用{{1}}。

  • 为什么Ruby设计为不允许跨线程调用枚举器(或光纤),
  • 是否有另一种提供类似功能的方法?

我猜测枚举器/光纤上的操作的原子性在这里是相关的,但我不完全确定。如果这是问题,那么在使用时独占锁定枚举器/光纤将解决问题,我不知道为什么通常禁止跨线程调用枚举器/光纤。如果可以通过使用锁定来提供替代方案,那将满足我的需要。

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