saw*_*awa 6 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
Run Code Online (Sandbox Code Playgroud)
它引发了一个错误:
Fiber called across threads.
Run Code Online (Sandbox Code Playgroud)
当enum从被称为t2后一旦被调用t1.
我猜测枚举器/光纤上的操作的原子性在这里是相关的,但我不完全确定.如果这是问题,那么在使用时独占锁定枚举器/光纤将解决问题,我不知道为什么通常禁止跨线程调用枚举器/光纤.如果可以通过使用锁定来提供替代方案,那将满足我的需要.
您可以使用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
Run Code Online (Sandbox Code Playgroud)