Является ли '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 ответ

Решение

Я думаю, что вы поняли, но было бы хорошо, чтобы было несколько слов, чтобы прояснить:

  1. Важное различие не совсем между require а также autoload но между нетерпеливой и ленивой загрузкой. Стремительная загрузка является поточно-ориентированной и эффективно использует память при разветвлении, но замедляет запуск сервера. Ленивая загрузка не является ни поточно-ориентированной, ни эффективной для памяти при разветвлении, но она обеспечивает быстрый запуск сервера. require или же autoload вместе с Rails eager_autoload нетерпеливый груз; autoload сам по себе ленивый груз.

  2. Учитывая вышесказанное, разные серверы и версии Ruby порождают разные проблемы для отложенной и активной загрузки:

    • На многопоточном сервере отложенная загрузка небезопасна, поэтому требуется полная загрузка (хм).
    • На четном сервере ленивая загрузка хороша, так что вы могли бы также лениво загрузить для быстрого запуска сервера.
    • На разветвляющемся сервере отложенная загрузка безопасна, но неэффективна с точки зрения памяти.
      • В Ruby < 2 активная загрузка также неэффективна из-за нехватки памяти, поскольку Ruby < 2 не поддерживает копирование при записи. Таким образом, вы могли бы также загрузить лениво. (На самом деле, то, что вы должны сделать, это обновить до текущего Ruby.)
      • В Ruby >= 2 активная загрузка экономит память, поскольку использует преимущества копирования при записи и поэтому предпочтительна.
Другие вопросы по тегам