Использует ли uWSGI предварительно скомпилированные файлы Python?

Я использую uWSGI для развертывания своего приложения WSGI. Компилируется ли файл Python для каждого запроса или предварительно компилируется один раз? Я не вижу никаких .pyc файлов.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
735
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

По первому запросу uWSGI загрузит скрипты Python bytecode и перезагрузит их в двух известных мне сценариях:

  1. Есть новый импорт, который ранее не загружался (будет парситься и конвертироваться в байткод только новый модуль).
  2. Вы явно сбежали service uwsgi restart

Тем не менее, все еще есть способ перезагружать скрипты Python в каждом запросе, подавляя его интерпретатором, например: python -B my_amazing_view.py

Для получения более подробной информации проверьте здесь:

  1. Что такое тайник
  2. Должен ли я генерировать .pyc

Это на самом деле немного сложнее. Среда выполнения Python только компилирует (или, точнее, только кэширует скомпилированный код) модули, а не скрипты (на самом деле разница заключается в том, импортируете ли вы файл или выполняете его).

bruno desthuilliers 05.03.2019 13:02

Большое спасибо, сэр, ваши ссылки очень помогли.

lmao 07.03.2019 18:24
Ответ принят как подходящий

Python кэширует байт-код модулей — прямо в том же месте для python2.x, в подпапке __pycache__ для python3 — но скрипты (разница в использовании — если вы импортируете его, это модуль, если вы выполняете его, это скрипт) всегда перекомпилируются (именно поэтому основные скрипты обычно очень короткие и простые).

IOW, ваш основной скрипт wsgi будет перекомпилирован один раз для каждого нового серверного процесса. Обычно приложение wsgi обслуживается как длительный процесс, который будет обрабатывать гораздо более одного запроса, поэтому даже в этом случае начальные накладные расходы на компиляцию действительно не являются проблемой (короткий скрипт + компилируется только один раз для каждого процесса)...

Кроме того, после запуска процесса Python импортированные модули кэшируются в памяти, поэтому они действительно импортируются (загружаются) только один раз для каждого процесса.

Просто обратите внимание, что пользователь, под которым запущен процесс, должен иметь права на запись в каталог вашего приложения, чтобы создавать файлы .pyc... и, конечно же, права на чтение файлов .pyc.

Я не ставлю под сомнение достоверность вашего ответа, но не могли бы вы указать на официальную документацию, где описывается эта разница в поведении скриптов? Я ничего не нашел об этом ни в ПЭП-3147, ни в Импорт. Инвалидация кэшированного байт-кода

Alex Yu 05.03.2019 13:40

@AlexYu это хотя бы упоминается здесь: docs.python.org/2/tutorial/modules.html#compiled-python-file‌​s и, немного по-другому, здесь: docs.python.org/3/tutorial/modules.html#compiled-python-file‌​s

bruno desthuilliers 05.03.2019 14:08

Спасибо! Я нашел в первой ссылке для python-2: "Когда скрипт запускается путем указания его имени в командной строке, байт-код для скрипта никогда не записывается в файл .pyc или .pyo"". Странно, что это предложение удалено из документации python-3.

Alex Yu 05.03.2019 14:22

@AlexYu он был заменен на «он всегда перекомпилирует и не сохраняет результат для модуля, загружаемого непосредственно из командной строки», возможно, также для учета параметра python -m modulename CLI.

bruno desthuilliers 05.03.2019 14:23

Большое спасибо @bruno & Alex. Теперь я знаю, почему мой основной скрипт должен быть маленьким и что я должен импортировать модули, чтобы избежать повторной компиляции.

lmao 07.03.2019 18:23

Другие вопросы по теме