Почему фоновая задача блокирует ответ в SimpleHTTPServer?

Я пишу простой интерфейс на основе браузера, который должен иметь возможность запускать фоновую задачу, а затем получать от нее прогресс. Я хочу, чтобы браузер получил ответ о том, успешно ли запущена задача, а затем опросить, чтобы определить, когда она будет выполнена. Однако наличие фоновой задачи, по-видимому, препятствует немедленной отправке ответа XMLHttpRequest, поэтому я не могу сообщить об успешном запуске процесса. Рассмотрим следующий (упрощенный) код:

import SocketServer
import SimpleHTTPServer
import multiprocessing
import time

class MyProc(multiprocessing.Process):
    def run(self):
        print 'Starting long process..'
        for i in range(100): time.sleep(1)
        print 'Done long process'

class Page(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/':
            print >>self.wfile, "<html><body><a href='/run'>Run</a></body></html>"
        if self.path == '/run':
            self.proc = MyProc()
            print 'Starting..'
            self.proc.start()
            print 'After start.'
            print >>self.wfile, "Process started."

httpd = SocketServer.TCPServer(('', 8000), Page)
httpd.serve_forever()

Когда я запускаю это, и перейдите кHTTP: // локальный: 8000Я получаю кнопку с именем «Выполнить». Когда я нажимаю на него, терминал отображает:

Starting..
After start.

Однако вид браузера не меняется .. на самом деле курсор вращается. Только когда я нажимаю Ctrl-C в терминале, чтобы прервать программу, браузер обновляется сообщениемProcess started.

СообщениеAfter start явно печатается. Поэтому я могу предположить, чтоdo_GET возвращается после запуска процесса. Тем не менее, браузер не получает ответ, пока я не прерву длительный процесс. Я должен заключить, что есть что-то блокирующее междуdo_GET и отправляемый ответ, который находится внутриSimpleHTTPServer.

Я также пробовал это с потоками и подпроцессом. Открыть, но столкнулся с аналогичными проблемами. Есть идеи?

Ответы на вопрос(3)

Ваш ответ на вопрос