Как Python работает внутри? Может ли более чем один интерпретатор python сделать загрузку процессора слишком высокой?

сценарий

Я вызываю скрипты Python, используя exec(...) в php, и python работает со своей стороны, и это неструктурированная среда, нет django или каких-либо других фреймворков.

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

Так что, если есть какой-либо запрос от клиента, он должен быть удовлетворен немедленно. Здесь для нас время также является главной проблемой, мы не можем задержать процесс.

Поэтому, если я получу слишком много запросов от клиента (может быть, crons также работает одновременно), я получу слишком много процессов на Python, и, насколько я знаю, каждый exec(...) будет вызывать интерпретатор. Так что, если в любом случае я могу предотвратить вызов переводчика при каждом вызове, это будет хорошо для меня. Память в 1Кб или 1Мб очень полезна.

Проблемы

  1. Использование памяти велико (если я могу сэкономить 1 МБ, я хочу попробовать любое решение. Предполагается, что скрипт хорошо написан. Правильный сон дается в цикле, а сборщик мусора управляется хорошо.)
  2. Иногда для долго работающего скрипта Python, если этот скрипт вызывается из php, использование exec(...) и процесс не вызывается в фоновом режиме, и этот скрипт python завершен, и все же требуется время для выполнения следующей строки после этого exec,

Решение

Для решения я подумал, что я должен использовать вызовы API для Python. Но помните, я не могу использовать какие-либо рамки. Чтобы использовать фреймворк, мне нужно переписать код, а в моем случае это невозможно. Таким образом, CGI и FCGI могут помочь мне здесь.

Чтобы запускать скрипты Python из вызовов API, мне нужно включить CGI.

Но то, что я нашел, интересно:

Программы, использующие CGI для связи со своим веб-сервером, должны запускаться сервером для каждого запроса. Таким образом, каждый запрос запускает новый интерпретатор Python, который запускается некоторое время, что делает весь интерфейс пригодным для использования только в ситуациях с низкой нагрузкой.

общий интерфейс шлюза.

Если я буду запускать скрипт вроде следующего, то все сразу запустится

subprocess.Popen(["python", "program1.py"])
subprocess.Popen(["python", "program2.py"])
subprocess.Popen(["python", "program3.py"])
subprocess.Popen(["python", "program4.py"])
subprocess.Popen(["python", "program5.py"])
subprocess.Popen(["python", "program6.py"])

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

1) Могу ли я запретить модулю python создавать больше интерпретатора, и если да, то как мне это сделать?

2) Сколько максимальных интерпретаторов может создать модуль python (сразу как в приведенном выше коде)?

1 ответ

Я не уверен, полностью ли я понял, что вы спросили. Как правило, в любом контексте код выполняется последовательно, если явно не указано иное. Если вы поместите эти строки в вашу оболочку, ваша оболочка сначала запустит экземпляр python для program1.py, Вы не можете приступить к выполнению program2.py пока ты не закончишь program1.py, Таким образом, у вас есть только один интерпретатор Python в любой момент времени.

Если вы хотите запускать каждый скрипт как фоновый процесс, вам нужно поставить & в конце каждой строки это python program1.py &, Таким образом, вы можете запустить несколько скриптов одновременно. Если выполнение ваших сценариев занимает много времени, у вас будет одновременно работать 6 переводчиков. Я уверен, что для каждого сценария нужен ровно один интерпретатор.

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