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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |