ruby – 跨线程共享枚举器

前端之家收集整理的这篇文章主要介绍了ruby – 跨线程共享枚举器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从不同的线程调用一个普通的枚举器.当我做以下,
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.

在从t1调用一次后从t2调用枚举时.

>为什么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

猜你在找的Ruby相关文章