如何编写不同步发送响应的HTTP服务器?
我想启用:
但是,看起来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
等-BaseHTTPRequestHandler
中的所有便捷方法。上面,我通过了wfile
,因为我想知道在新线程中它是否会被“冻结”,我真的不希望通过self
来工作(因为我认为其所有方法都将指向新请求) ,而不是创建线程时相关的请求。]
那么,如何在不阻塞主线程的情况下延迟对客户端的响应?
默认情况下,BaseHTTPServer.HTTPServer
process one request a time都在主线程中,它阻塞并希望请求处理程序在完成时返回。
为了使其无阻塞,您需要更改上层,使用ThreadingMixIn
创建线程化的HTTP服务器,参考this answer。