Странное поведение с нитями и волокнами
Этот код:
Fiber.new do
Thread.current['a'] = 5
p Thread.current.object_id
p Thread.current['a']
Fiber.new do
p Thread.current.object_id
p Thread.current['a']
end.resume
p Thread.current.object_id
p Thread.current['a']
end.resume
показывает следующие результаты:
3442840
5
3442840
nil
3442840
5
Почему current['a']
вернуть nil
во вложенном волокне? Чем это можно объяснить?
1 ответ
Решение
Thread#[]
а такжеThread#[]=
не локально для потока, а для волокна. Эта путаница не существовала в Ruby 1.8, потому что волокна были доступны только после Ruby 1.9. Ruby 1.9 выбирает, что методы ведут себя локально, чтобы сохранить следующие идиомы для динамической области видимости.