对HTTP请求的延迟响应而没有阻塞

问题描述 投票:0回答:1

如何编写不同步发送响应的HTTP服务器?

我想启用:

  1. 请求1到达
  2. 同步服务处理请求1,但不阻塞主线程
  3. 在此期间,请求2到达并以其自己独特的方式处理
  4. 请求1返回给客户端
  5. ...等。

但是,看起来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_responseend_headers等-BaseHTTPRequestHandler中的所有便捷方法。上面,我通过了wfile,因为我想知道在新线程中它是否会被“冻结”,我真的不希望通过self来工作(因为我认为其所有方法都将指向新请求) ,而不是创建线程时相关的请求。]

那么,如何在不阻塞主线程的情况下延迟对客户端的响应?

python asynchronous python-2.x python-multithreading
1个回答
0
投票

默认情况下,BaseHTTPServer.HTTPServer process one request a time都在主线程中,它阻塞并希望请求处理程序在完成时返回。

为了使其无阻塞,您需要更改上层,使用ThreadingMixIn创建线程化的HTTP服务器,参考this answer

© www.soinside.com 2019 - 2024. All rights reserved.