Является ли автозагрузка поточно-ориентированной в Ruby 1.9? - PullRequest
15 голосов
/ 15 мая 2010

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

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

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

Ответы [ 3 ]

9 голосов
/ 02 июля 2011

Принесу обновление 2011 года, так как мне тоже было любопытно.

На данный момент открыто два билета:

Основные разработчики предполагают, что требуют и автозагрузки работают одинаково и являются потокобезопасными, в CRuby / JRuby 1.9. Это в том смысле, что ruby ​​сохраняет блокировку до полной загрузки файла.

Это имеет неудобный побочный эффект от введения потенциальных тупиков, однако. В частности:

  1. Th1 загрузить А и заблокировать его
  2. Th2 нагрузка B и блокировка
  3. Th1 пытается загрузить B как часть загрузки A, начинает ждать Th2
  4. Th2 пытается загрузить A как часть загрузки B, начинает ждать Th1
  5. Тупик ...

Вывод, вероятно, таков: потребуйте все, что вам нужно, перед запуском потока, если в вашем приложении есть вероятность тупика.

7 голосов
/ 15 мая 2010

Я не знаю об общем случае, но пример воспроизведения из этого потока не ломается в 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
0 голосов
/ 14 июня 2010

это всегда сломано.

Подгрузка

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

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

class Lib
  extend SomeClassFuncs
  do_something_with_class_funcs
end

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

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

...