1
我希望能夠通過立即返回消息,然後啓動一個進程在後臺運行並完成任務來響應GET。這適用於BaseHTTPServer.HTTPServer和擴展BaseHTTPRequestHandler。但是,當我按照here的說明將SSL添加到服務器時,直到子進程完成後纔會發送響應。假設Firefox在收到它時顯示它收到的內容,並用Firebug進行雙重檢查,看起來好像什麼也沒有發送,直到子進程完成。我在Chrome中測試過,看到了相同的結果。下面的代碼;我不知道如何繼續調試。pyOpenSSL + HTTPServer:請求不會完成,直到所有進程完成
class SecureHTTPServer(HTTPServer):
def __init__(self, server_address, HandlerClass):
BaseServer.__init__(self, server_address, HandlerClass)
ctx = SSL.Context(SSL.SSLv3_METHOD)
ctx.use_privatekey_file(SSL_CERT)
ctx.use_certificate_file(SSL_CERT)
self.socket = SSL.Connection(ctx, socket.socket(self.address_family, self.socket_type))
self.server_bind()
self.server_activate()
def shutdown_request(self, request):
request.shutdown()
class RecordingHandler(BaseHTTPRequestHandler):
def setup(self):
self.connection = self.request
self.rfile = socket._fileobject(self.request, "rb", self.rbufsize)
self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
def do_GET(self):
key = 'abc'
p = Process(target = some_func, args = (key,))
# Some_func takes ~15 seconds to complete, and it logs its progress so that it's clear that the response is only sent after some_func is complete.
p.daemon = True
p.start()
self.send_response(200)
self.end_headers()
self.wfile.write('recording key ' + key)
def run():
try:
server = SecureHTTPServer(('', 8080), RecordingHandler)
print 'Waiting for input on port 8080.'
server.serve_forever()
except KeyboardInterrupt:
print 'Received keyboard interrupt, exiting.'
server.shutdown()