网站首页学无止境PYTHON

python框架Tornado之二Tornado攻略(9) 非阻塞式异步请求与异步HTT

发布时间:2014-07-25 17:27:18编辑:songlin阅读(131)

    非阻塞式异步请求

    当 一个处理请求的行为被执行之后,这个请求会自动地结束。因为 Tornado 当中使用了 一种非阻塞式的 I/O 模型,所以你可以改变这种默认的处理行为——让一个请求一直保持 连接状态,而不是马上返回,直到一个主处理行为返回。要实现这种处理方式,只需要 使用 tornado.web.asynchronous 装饰器就可以了。

    使用了这个装饰器之后,你必须调用 self.finish() 已完成 HTTTP 请求,否则 用户的浏览器会一直处于等待服务器响应的状态:

    1. class MainHandler(tornado.web.RequestHandler): 
    2.     @tornado.web.asynchronous 
    3.     def get(self): 
    4.         self.write("Hello, world"
    5.         self.finish() 

    下面是一个使用 Tornado 内置的异步请求 HTTP 客户端去调用 FriendFeed 的 API 的例 子:
     

    1. class MainHandler(tornado.web.RequestHandler): 
    2.     @tornado.web.asynchronous 
    3.     def get(self): 
    4.         http = tornado.httpclient.AsyncHTTPClient() 
    5.         http.fetch("http://friendfeed-api.com/v2/feed/bret"
    6.                    callback=self.on_response) 
    7.  
    8.     def on_response(self, response): 
    9.         if response.error: raise tornado.web.HTTPError(500
    10.         json = tornado.escape.json_decode(response.body) 
    11.         self.write("Fetched " + str(len(json["entries"])) + " entries "
    12.                    "from the FriendFeed API"
    13.         self.finish() 

    例子中,当 get() 方法返回时,请求处理还没有完成。在 HTTP 客户端执行它的回 调函数 on_response() 时,从浏览器过来的请求仍然是存在的,只有在显式调用了 self.finish() 之后,才会把响应返回到浏览器。

    关于更多异步请求的高级例子,可以参阅 demo 中的 chat 这个例子。它是一个使用 long polling 方式 的 AJAX 聊天室。如果你使用到了 long polling,你可能需要复写on_connection_close(), 这样你可以在客户连接关闭以后做相关的清理动作。(请查看该方法的代码文档,以防误用。)

    异步 HTTP 客户端

    Tornado 包含了两种非阻塞式 HTTP 客户端实现:SimpleAsyncHTTPClient 和 CurlAsyncHTTPClient。前者是直接基于 IOLoop 实现的,因此无需外部依赖关系。 后者作为 Curl 客户端,需要安装 libcurl 和 pycurl 后才能正常工作,但是对于使用 到 HTTP 规范中一些不常用内容的站点来说,它的兼容性会更好。为防止碰到 旧版本中异步界面的 bug,我们建议你安装最近的版本的 libcurl 和 pycurl

    这些客户端都有它们自己的模组(tornado.simple_httpclient 和 tornado.curl_httpclient),你可以通过tornado.httpclient 来指定使用哪一种 客户端,默认情况下使用的是 SimpleAsyncHTTPClient,如果要修改默认值,只要 在一开始调用 AsyncHTTPClient.configure 方法即可:

    1. AsyncHTTPClient.configure('tornado.curl_httpclient.CurlAsyncHTTPClient'

本文来源地址:http://sebug.net/paper/books/tornado/