У меня есть веб-приложение Python, которое должно запустить длительный процесс. Выгода, я не хочу, чтобы она ждала процесс для окончания. Просто запуск и конец.
Я работаю на Windows XP, и веб-приложение работает под IIS (если это имеет значение).
До сих пор я попробовал popen, но это, казалось, не работало. Это ожидало до законченного дочернего процесса.
Ок, я наконец-то разобрался с этим! Кажется, это работает:
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
- это Флаг создания процесса, который передается в базовую функцию WINAPI CreateProcess.
Это почти работает (отсюда):
from subprocess import Popen
pid = Popen(["C:\python24\python.exe", "long_run.py"]).pid
print pid
print 'done'
'done' будет напечатано сразу. Проблема в том, что приведенный выше процесс продолжает работать до тех пор, пока long_run.py не вернется, и если я закрою процесс, он убьет процесс long_run.py.
Конечно, есть какой-то способ сделать процесс полностью независимым от родительского процесса.
Вместо прямого запуска процессов из веб-приложения вы можете записывать задания в очередь сообщений. Отдельная служба читает из очереди сообщений и запускает задания. Взгляните на Celery , распределенную очередь задач, написанную на Python.