Мне кажется, что сообщество Ruby немного рассердилось на автозагрузку, поскольку
Является ли автозагрузка потокобезопасной в Ruby 1.9?
Ответ 1
Я не знаю об общем случае, но пример воспроизведения из этого потока не прерывается в 1.9.1:
autoloaded.rb:
sleep 1
Bar::Foo = 1
autoloader.rb:
module Bar
autoload :Foo, 'autoloaded.rb'
end
t1 = Thread.new { Bar::Foo }
t2 = Thread.new { Bar::Foo }
t1.join; t2.join
Ответ 2
Принеся обновление 2011 года, так как мне тоже было интересно.
В настоящий момент открыты два билета:
Основные разработчики предполагают, что требования и автозагрузка работают одинаково и безопасны для потоков в CRuby/JRuby 1.9. Это, в том смысле, что рубин сохраняет блокировку, пока файл не будет полностью загружен.
У этого есть неудобный побочный эффект введения потенциальных тупиков. В частности:
- Th1 load A и блокирует его
- Th2 load B и блокирует его
- Th1 пытается загрузить B как часть загрузки A, начинает ждать Th2
- Th2 пытается загрузить A как часть загрузки B, начинает ждать Th1
- Тупик...
Вероятно, вывод состоит в следующем: необходимо потребовать все, что вам нужно, прежде чем запускать поток, если в вашем приложении есть какой-либо потенциал для тупика.
Ответ 3
он всегда сломан.
subload позволяет переключаться между режимами в потоковой среде.
Я использую autoload все еще в потоковой среде, но только во время однопоточной последовательности загрузки. Я не вижу веских оснований для многопоточного процесса запуска в реальном мире. Если у вас его есть, вам, скорее всего, придется ставить в очередь действия для загрузки разделяемых библиотек, так как у вас всегда будут проблемы с безопасностью потоков с установкой уровня класса и экземпляра, наиболее часто с такими вещами, как:
class Lib
extend SomeClassFuncs
do_something_with_class_funcs
end
Этот код не является потокобезопасным временем загрузки, независимо от загрузчика.
Если вы не видите этого, вы не должны быть потоковым.