我想從不同的線程調用一個普通的枚舉器。當我這樣做,跨主題共享一個枚舉器
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.
時enum
從t2
一次後調用從t1
被調用。
- 爲什麼紅寶石設計成不允許枚舉(或光纖)在線程被調用,並
- 是否有以提供類似的功能的另一種方式?
我猜測枚舉器/光纖操作的原子性在這裏是相關的,但我不完全確定。如果這是問題,那麼在使用時獨佔鎖定枚舉器/光纖將解決問題,並且我不知道爲什麼通常禁止跨線程調用枚舉器/光纖。如果可以通過使用鎖定來提供替代方案,那將滿足我的需要。
將隊列滿足您的需求? –
@UriAgassi如果你可以做到這一點,它會。 – sawa
@sawa,你最終做了什麼? –