Python - Запустите длительный процесс из веб-приложения

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

Я работаю на Windows XP, а веб-приложение работает под IIS (если это имеет значение).

До сих пор я пробовал popen, но, похоже, это не сработало. Он ждал, пока дочерний процесс не закончится.

4 ответа

Решение

Хорошо, я наконец понял это! Это похоже на работу:

from subprocess import Popen
from win32process import DETACHED_PROCESS

pid = Popen(["C:\python24\python.exe", "long_run.py"],creationflags=DETACHED_PROCESS,shell=True).pid
print pid
print 'done' 
#I can now close the console or anything I want and long_run.py continues!

Примечание: я добавил shell=True. В противном случае вызов print в дочернем процессе дал мне ошибку "IOError: [Errno 9] Bad file descriptor"

DETACHED_PROCESS является флагом создания процесса, который передается в базовую функцию CreateProcess WINAPI.

Вместо непосредственного запуска процессов из вашего веб-приложения вы можете записывать задания в очередь сообщений. Отдельная служба читает из очереди сообщений и запускает задания. Взгляните на Celery, Распределенную Очередь Задач, написанную на Python.

Это почти работает ( отсюда):

from subprocess import Popen

pid = Popen(["C:\python24\python.exe", "long_run.py"]).pid
print pid
print 'done'

"Готово" будет напечатано сразу. Проблема в том, что описанный выше процесс продолжается до тех пор, пока не вернется long_run.py, и если я закрою процесс, он убьет процесс long_run.py.

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

subprocess.Popen делает это.

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