ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### 非阻塞式异步请求 当一个处理请求的行为被执行之后,这个请求会自动地结束。因为 Tornado 当中使用了 一种非阻塞式的 I/O 模型,所以你可以改变这种默认的处理行为——让一个请求一直保持 连接状态,而不是马上返回,直到一个主处理行为返回。要实现这种处理方式,只需要 使用 `tornado.web.asynchronous` 装饰器就可以了。 使用了这个装饰器之后,你必须调用 `self.finish()` 已完成 HTTTP 请求,否则 用户的浏览器会一直处于等待服务器响应的状态: ``` class MainHandler(tornado.web.RequestHandler): @tornado.web.asynchronous def get(self): self.write("Hello, world") self.finish() ``` 下面是一个使用 Tornado 内置的异步请求 HTTP 客户端去调用 FriendFeed 的 API 的例 子: ``` class MainHandler(tornado.web.RequestHandler): @tornado.web.asynchronous def get(self): http = tornado.httpclient.AsyncHTTPClient() http.fetch("http://friendfeed-api.com/v2/feed/bret", callback=self.on_response) def on_response(self, response): if response.error: raise tornado.web.HTTPError(500) json = tornado.escape.json_decode(response.body) self.write("Fetched " + str(len(json["entries"])) + " entries " "from the FriendFeed API") self.finish() ``` 例子中,当 `get()` 方法返回时,请求处理还没有完成。在 HTTP 客户端执行它的回 调函数 `on_response()` 时,从浏览器过来的请求仍然是存在的,只有在显式调用了 `self.finish()` 之后,才会把响应返回到浏览器。 关于更多异步请求的高级例子,可以参阅 demo 中的 `chat` 这个例子。它是一个使用 [long polling](http://en.wikipedia.org/wiki/Push_technology#Long_polling) 方式 的 AJAX 聊天室。如果你使用到了 long polling,你可能需要复写`on_connection_close()`, 这样你可以在客户连接关闭以后做相关的清理动作。(请查看该方法的代码文档,以防误用。)