Если я пытаюсь создать процесс с контроллера pylons , сервер не закрывает соединение после отправки ответа.
Предположим, что test.py
- это длительный процесс, тогда этот метод в контроллере пилонов создает ответ, но поддерживает соединение открытым:
def index(self):
from subprocess import Popen
Popen(["python", "/temp/test.py"])
return "<h1>Done!</h1>"
Перемещение Popen
в новую ветку не помогло.
К счастью, я нашел обходной путь: я запускаю новую тему и добавляю sleep
перед Popen
. Если Popen запускается после отправки ответа, соединение будет закрыто должным образом.
def test(self):
def worker():
import time
time.sleep(5)
from subprocess import Popen
Popen(["python", "/temp/test.py"])
from threading import Thread
Thread(target=worker).start()
return "<h1>Done!</h1>"
Может кто-нибудь объяснить это поведение? Я хотел бы быть уверен, что не вызову странных проблем в будущем.
Я использую Python 2.5 и Pylons 0.9.6.1 в Windows XP SP3.
ОБНОВЛЕНИЕ : ответ bnonlan определенно на правильном пути. Popen
имеет параметр с именем close_fds
, который должен решить эту проблему. В версии subprocess
модуля Python 2.5 этот параметр не поддерживается в Windows. Однако в версии Python 2.6 вы можете установить этот параметр на True
, если не перенаправляете stdin / stdout / stderr.
def index(self):
# I copied the 2.6 version of subprocess.py into my tree
from python26.subprocess import Popen
Popen(["python", "/temp/test.py"], close_fds=True)
return "<h1>Done!</h1>"
К сожалению, я делаю хочу перенаправить стандартный вывод, поэтому мне нужно найти другое решение. Кроме того, это подразумевает, что обнаруженный мной обходной путь может препятствовать закрытию других запросов, если они выполняются при выполнении Popen. Это беспокоит.