Почему пилоны не закрывают соединение, если запущен подпроцесс? - PullRequest
1 голос
/ 20 мая 2009

Если я пытаюсь создать процесс с контроллера 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. Это беспокоит.

...