添加@ tornado.web.asynchronous装饰器有什么好处?

时间:2014-12-12 03:37:01

标签: python tornado

class IndexHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(request):
        request.render("../resouce/index.html")

我总是阅读上面的一些龙卷风代码,混淆了添加这个装饰器的目的是什么?我知道添加这个装饰器,我们应该手动调用self.finish(),但这样做有什么好处?

谢谢!

1 个答案:

答案 0 :(得分:3)

通常,当处理程序方法返回时,会为您调用finish(),但如果您的处理程序依赖于异步计算的结果(如HTTP请求),那么它将无法完成方法返回的时间。相反,它应该在一些回调中完成。

来自the documentation的示例很有启发性:

class MyRequestHandler(web.RequestHandler):
    @web.asynchronous
    def get(self):
       http = httpclient.AsyncHTTPClient()
       http.fetch("http://friendfeed.com/", self._on_download)

    def _on_download(self, response):
       self.write("Downloaded!")
       self.finish()

如果没有装饰器,在输入_on_download时,请求就已经完成了。

如果您的处理程序没有执行任何异步操作,那么添加装饰器就没有任何好处。