Я пишу простой интерфейс на основе браузера, который должен иметь возможность запускать фоновую задачу, а затем получать от нее прогресс. Я хочу, чтобы браузер получил ответ о том, успешно ли запущена задача, а затем опросить, чтобы определить, когда она будет выполнена. Однако наличие фоновой задачи, по-видимому, препятствует немедленной отправке ответа 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://localhost:8000,, я получаю кнопку с именем «Выполнить». Когда я нажимаю на него, терминал отображает:
Starting..
After start.
Однако вид браузера не меняется .. на самом деле курсор вращается. Только когда я нажимаю Ctrl-C в терминале, чтобы прервать программу, браузер обновляется с сообщением Process started.
Сообщение After start
явно печатается. Поэтому я могу предположить, что do_GET
возвращается после запуска процесса. Тем не менее, браузер не получает ответ, пока я не прерву длительный процесс. Я должен заключить, что между do_GET
и отправляемым ответом что-то блокируется, что находится внутри SimpleHTTPServer
.
Я также пробовал это с потоками и подпроцессом. Откройте, но столкнулся с похожими проблемами. Есть идеи?