如何在TornadoWeb中编写支持持久连接的Http服务器.
我的意思是将能够接收许多请求并在不关闭连接的情况下回答它们.它如何在异步中实际工作?
我只是想知道如何编写处理程序来处理持久连接.它究竟会如何运作?
我有这样的处理程序:
class MainHandler(RequestHandler): count = 0 @asynchronous def post(self): #get header content type content_type = self.request.headers.get('Content-Type') if not content_type in ACCEPTED_CONTENT: raise HTTPError(403, 'Incorrect content type') text = self.request.body self.count += 1 command = CommandObject(text, self.count, callback = self.async_callback(self.on_response)) command.execute() def on_response(self, response): if response.error: raise HTTPError(500) body = response.body self.write(body) self.flush()
完成后执行调用回调.
是我的正确的权利,事情那样post会多次调用,一个连接数将增加每个来自客户端的httprequest?但对于每个连接,我将有单独的计数值?
我不认为你的假设是正确的.我对Tornado服务器工作方式的理解是来自客户端的每个请求都会产生一个新的RequestHandler
.的宗旨,@tornado.web.asynchronous
装饰是为了防止服务器将自动关闭连接,当你处理函数(post
,get
等等)的回报.但在一天结束时,我认为每个请求只有一个响应.
我不相信客户端的其他请求将转到RequestHandler类的同一个实例.相反,我的理解是龙卷风的设立是为了允许长轮询范式.以下是通信流程的示例:
客户端POST
向Tornado服务器发出请求
Tornado服务器检查响应是否准备好,如果没有,您可以添加RequestHandler
到某种堆栈或队列(取决于您的应用程序架构)
服务器提供响应(可能是另一个用户向队列添加了需要分发给打开的连接的消息等)并将响应分发回RequestHandler
然后调用该finish()
函数来关闭连接
客户再次POST
请求重复该过程
我想如果你想实现真正的持久连接,你会想要研究tornado.websocket
(http://www.tornadoweb.org/documentation/websocket.html).我还没有试过那个模块,所以我担心我不能在那里提供任何意见.
祝你好运!