메시지를 즉시 반환 한 다음 백그라운드에서 실행하고 작업을 완료하기 위해 GET에 응답하고 싶습니다. 이것은 BaseHTTPServer.HTTPServer와 BaseHTTPRequestHandler를 확장하여 잘 작동합니다. 그러나 서버에 SSL을 추가하기 위해 지침 here을 수행하면 하위 프로세스가 완료 될 때까지 응답이 전송되지 않습니다. 파이어 폭스가 수신 할 때 수신 한 내용을 표시하고 파이어 버그를 사용하여 이중 검사한다고 가정하면 서브 프로세스가 완료 될 때까지 아무 것도 전송되지 않는 것처럼 보입니다. 크롬에서 테스트 한 결과 동일한 결과가 나타났습니다. 아래 코드; 디버깅을 계속하는 방법에 대한 손실이 있습니다.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()