Как запустить подпроцесс в Python, который работает независимо и продолжает работать, если основной процесс закрыт? - PullRequest
2 голосов
/ 07 мая 2019

У меня есть небольшой API Flask, который получает запросы от удаленного сервера. При получении запроса запускается подпроцесс. Этот подпроцесс просто выполняет второй файл Python, который находится в той же папке. Этот подпроцесс может выполняться в течение нескольких часов, и несколько из этих подпроцессов могут выполняться одновременно. Я использую стандартный вывод, чтобы записать вывод файла Python в текстовый файл.

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

Это небольшой пример, который иллюстрирует, что я делаю (этот код в основном находится внутри метода, который можно вызывать через API)

import subprocess

f = open("log.txt","wb")
subprocess.Popen(["python","job.py"],cwd = "./", stdout = f, stderr = f)

Мне бы хотелось, чтобы подпроцесс продолжал работать после того, как я остановил Flask API. В настоящее время это не так. В другом месте я читал, что причина в том, что я использую параметры stdout и stderr, но даже после их удаления поведение остается прежним.

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Используйте fork () для создания дочернего процесса, в котором вы вызываете эту функцию. При успешном выполнении fork () он возвращает ноль для дочернего идентификатора.

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

import os
pid = os.fork()
if pid == 0:  # new process
    os.system("nohup python ./job.py &")

Надеюсь, это поможет!

0 голосов
/ 07 мая 2019

Ваши подпроцессы останавливаются, потому что их родительский процесс умирает при перезапуске вашего сервера Flask.Вам необходимо полностью отделить ваши подпроцессы от процесса Flask, запустив ваш вызов Python в новой оболочке:

from subprocess import call

# On Linux:
command = 'gnome-terminal -x bash -l -c "python job.py"'
# On Windows:
# command = 'cmd /c "python job.py"'
call(command, shell=True)

Таким образом, ваш вызов Python для job.py будет выполняться в отдельном окне терминала без измененийпроцесс вашего сервера Flask.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...