4

如何在 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 而增加?但是对于每个连接我都会有单独的计数值?

4

3 回答 3

5

我不认为你的假设是正确的。我对 Tornado 服务器工作方式的理解是来自客户端的每个请求都会产生一个新的RequestHandler. 装饰器的目的@tornado.web.asynchronous是防止服务器在您的处理函数( 、 等)返回时自动关闭post连接get。但归根结底,我认为每个请求只有一个响应。

我不相信来自客户端的其他请求会转到 RequestHandler 类的同一个实例。相反,我的理解是 Tornado 的设置允许长轮询范式。以下是通信流程的示例:

  1. 客户端POST向 Tornado 服务器发出请求
  2. Tornado 服务器检查响应是否准备就绪,如果没有,您可以将其添加RequestHandler到某种堆栈或队列中(取决于您的应用程序架构)
  3. 服务器提出一个响应(可能另一个用户在队列中添加了一条消息,需要分发到打开的连接等)并将响应分发回RequestHandler然后调用finish()函数关闭连接
  4. 客户端发出另一个POST请求以重复该过程

我想如果你想实现真正的持久连接,你会想要研究tornado.websockethttp://www.tornadoweb.org/documentation/websocket.html)。我还没有尝试过那个模块,所以恐怕我不能在那里提供任何输入。

祝你好运!

于 2011-11-10T22:15:48.920 回答
0

Tornado Web 框架实际上带有它自己的支持持久连接的服务器实现,因此不需要编写自己的服务器。文档中有一节介绍如何在生产中使用它(在 nginx 后面)。

于 2009-11-26T14:41:22.620 回答
0

从 tornado.web 模块的源代码中,您可以看到总是实例化一个新的处理程序,我认为无论如何您都不能重用处理程序。

于 2010-04-08T23:26:03.603 回答