Подтвердить что ты не робот

Является ли автозагрузка потокобезопасной в Ruby 1.9?

Мне кажется, что сообщество Ruby немного рассердилось на автозагрузку, поскольку

4b9b3361

Ответ 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

Этот код не является потокобезопасным временем загрузки, независимо от загрузчика.

Если вы не видите этого, вы не должны быть потоковым.