Как я могу кодировать HTTP-сервер, где ответы не отправляются синхронно?
Я хотел бы включить:
- Запрос 1 приходит
- Синхронный служба обрабатывает запрос 1, но не блокирует основной поток
- . При этом поступает запрос 2 и обрабатывается его уникальным способом
- Запрос 1 возвращается клиенту
- ... et c.
Но, похоже, как только do_GET
или аналогичные методы достигнут своей цели, сервер отправляет ответ клиенту. Мне уже поздно отправлять свой ответ позже.
Например,
import time
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from threading import Thread
class HTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
# I have some code that MUST run on the main thread during do_GET
run_something_on_main_thread()
# and some code that I really don't want to
responder_thread = Thread(target=self._respond_later, args=(self.wfile,))
def _respond_later(self, wfile):
u""" Query some blocking service, then respond to the request """
time.sleep(2)
wfile.write('HTTP/1.0 204 No Content\n\n')
wfile.close()
if __name__ == '__main__':
server_address = (u'0.0.0.0', 8000)
http_server = HTTPServer(server_address, HTTPRequestHandler)
print u'Starting httpd server on {}:{}'.format(*server_address)
http_server.serve_forever()
Запросы на этот сервер всегда приводят к пустым ответам.
В идеале я бы хотел способ сделать это, что позволяет мне использовать send_response
, end_headers
et c. - все удобные методы от BaseHTTPRequestHandler
. Выше я передаю wfile
, потому что мне было интересно, будет ли он «заморожен» в новом потоке, я действительно не ожидаю, что передача self
сработает (потому что я думаю, что все его методы будут направлены на новый запрос , а не запрос, релевантный на момент создания потока).
Так как мне отложить ответ клиенту без блокировки основного потока?