Почему фоновая задача блокирует ответ в 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
.
Я также пробовал это с потоками и подпроцессом. Открыть, но столкнулся с аналогичными проблемами. Есть идеи?