相关疑难解决方法(0)

跨线程共享枚举器

我想从不同的线程调用一个普通的枚举器.当我做以下,

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
Run Code Online (Sandbox Code Playgroud)

它引发了一个错误:

Fiber called across threads.
Run Code Online (Sandbox Code Playgroud)

enum从被称为t2后一旦被调用t1.

  • 为什么Ruby设计为不允许跨线程调用枚举器(或光纤),以及
  • 有没有其他方法可以提供类似的功能?

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

ruby multithreading enumerator

6
推荐指数
1
解决办法
788
查看次数

标签 统计

enumerator ×1

multithreading ×1

ruby ×1