Python - Запустите длительный процесс из веб-приложения - PullRequest
6 голосов
/ 04 июня 2010

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

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

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

Ответы [ 4 ]

7 голосов
/ 04 июня 2010

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

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 descriptor file» »

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

2 голосов
/ 04 июня 2010

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

1 голос
/ 04 июня 2010

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

from subprocess import Popen

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

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

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

0 голосов
/ 04 июня 2010
...