龙卷风网络&持久连接

时间:2009-11-26 14:34:08

标签: asynchronous tornado persistent-connection

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

3 个答案:

答案 0 :(得分:5)

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

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

  1. 客户端向Tornado服务器发出POST请求
  2. Tornado服务器检查响应是否准备好,如果不是,您可以将RequestHandler添加到某种堆栈或队列中(取决于您的应用程序架构)
  3. 服务器提供响应(可能是另一个用户向队列添加了需要分发给开放连接的消息等)并将响应分发回RequestHandler然后调用{{1用于关闭连接的函数
  4. 客户提出另一个finish()请求以重复此过程
  5. 我认为如果你想实现真正的持久连接,你需要调查POSThttp://www.tornadoweb.org/documentation/websocket.html)。我还没有试过那个模块,所以我担心我不能在那里提供任何意见。

    祝你好运!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

相关问题