Действительно ли автозагрузка ориентирована на многопотоковое исполнение в Ruby 1.9?

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

Кто-либо знает, не является ли это больше проблемой в Ruby 1.9.1 или 1.9.2? Я видел, что немного разговора об обертывании требует во взаимных исключениях и таком, но эти 1,9 журнала изменений (или по крайней мере так же, как я смог найти), кажется, не рассматривают этот конкретный вопрос. Я хотел бы знать, могу ли я обоснованно начать автоматически загружаться в 1.9-единственных библиотеках без какого-либо разумного горя.

Заранее спасибо за любое понимание.

15
задан Andrew Grimm 2 July 2011 в 13:12
поделиться

2 ответа

Я не знаю об общем случае, но пример воспроизведения из этого потока не ломается в 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
7
ответ дан 1 December 2019 в 04:46
поделиться

он всегда сломан. Подзагрузка

позволяет переключать режимы в многопоточной среде.

Я использую автозагрузку еще в многопоточной среде, но только во время однопоточной загрузки. Я не вижу веских причин для использования многопоточного процесса запуска в реальном приложении. Если он у вас есть, вам, вероятно, придется поставить в очередь действия по загрузке разделяемых библиотек, так как у вас всегда будут проблемы с безопасностью потоков при настройке уровня класса и экземпляра, в основном с такими вещами, как:

class Lib
  extend SomeClassFuncs
  do_something_with_class_funcs
end

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

Если вы этого не видите, вам не следует запускать потоки.

-4
ответ дан 1 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: