Является ли 'require' предпочтительнее 'автозагрузки' с Ruby 2 на многопроцессорном сервере форка?
Я читаю эту статью. Меня беспокоит польза autoload
против require
, После прочтения статьи я понял, что использование autoload
для многопоточных серверов это плохо, потому что один поток может попытаться загрузить объект, который еще не находится в памяти.
В статье говорится о многопроцессорных серверах? Автозагрузка хороша для тех? Тогда это говорит, что это зависит. Если сервер использует fork (который порождает новый процесс для каждого запроса), например Phusion Passenged, и вы используете Ruby 2, то автозагрузка не выгодна.
Причина в том, что в Ruby 2 используется семантика копирования при записи. Это означает, что лучше использовать require
чем autoload
, С семантикой копирования при записи, если мы загружаем Foo::Bar
при загрузке у нас будет одна копия Foo::Bar
разделены между всеми процессами. Следовательно, большого объема памяти не будет.
Однако, если мы не используем Ruby 2 и не используем многопроцессорный сервер, который использует fork, каждый процесс в конечном итоге загрузит свою собственную копию Foo::Bar
возможно, приводит к более высокому использованию памяти. Следовательно, в этом случае autoload
предпочтительнее require
,
Правильна ли моя интерпретация статьи?
1 ответ
Я думаю, что вы поняли, но было бы хорошо, чтобы было несколько слов, чтобы прояснить:
Важное различие не совсем между
require
а такжеautoload
но между нетерпеливой и ленивой загрузкой. Стремительная загрузка является поточно-ориентированной и эффективно использует память при разветвлении, но замедляет запуск сервера. Ленивая загрузка не является ни поточно-ориентированной, ни эффективной для памяти при разветвлении, но она обеспечивает быстрый запуск сервера.require
или жеautoload
вместе с Railseager_autoload
нетерпеливый груз;autoload
сам по себе ленивый груз.Учитывая вышесказанное, разные серверы и версии Ruby порождают разные проблемы для отложенной и активной загрузки:
- На многопоточном сервере отложенная загрузка небезопасна, поэтому требуется полная загрузка (хм).
- На четном сервере ленивая загрузка хороша, так что вы могли бы также лениво загрузить для быстрого запуска сервера.
- На разветвляющемся сервере отложенная загрузка безопасна, но неэффективна с точки зрения памяти.
- В Ruby < 2 активная загрузка также неэффективна из-за нехватки памяти, поскольку Ruby < 2 не поддерживает копирование при записи. Таким образом, вы могли бы также загрузить лениво. (На самом деле, то, что вы должны сделать, это обновить до текущего Ruby.)
- В Ruby >= 2 активная загрузка экономит память, поскольку использует преимущества копирования при записи и поэтому предпочтительна.