加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 跨线程共享枚举器

发布时间:2020-12-16 20:46:19 所属栏目:百科 来源:网络整理
导读:我想从不同的线程调用一个普通的枚举器.当我做以下, enum = (0..1000).to_enumt1 = Thread.new do p enum.next sleep(1)endt2 = Thread.new do p enum.next sleep(1)endt1.joint2.join 它引发了一个错误: Fiber called across threads. 在从t1调用一次后从t
我想从不同的线程调用一个普通的枚举器.当我做以下,
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读