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.
Конечно, есть какой-то способ сделать процесс полностью независимым от родительского процесса.