正在加载...

tornado-10 web asynchronous

Tornado是一个异步框架,在单独的实例跑的时候,要注意。对于一些响应很长的操作,需要进行异步处理。

比方说,有一个第3方的api调用,一般都修改为异步处理。这样能保证你的服务正常被响应,而不会出现阻塞。

class Download(BaseController):

    @tornado.web.asynchronous
    def get(self):

        def _(response):
            self.finish(response.body)

        url = self.get_argument('download_url', '', True)
        httpclient.AsyncHTTPClient().fetch(url, _)

上面是这种写法比较麻烦,后来在tornado中加入了一个新的写方,叫做gen,看起来好像写同步代码一样。

class Download(BaseController):

    @tornado.web.asynchronous
    @gen.engine
    def get(self):
        url = self.get_argument('download_url', '', True)
        response = yield gen.Task(client.fetch, url)
        self.finish(response.body)

注意 @tornado.web.asynchronous 要在 @gen.engine 之前 这样是不是简洁了很多?那么第2中写法的原理是什么?我们之后慢慢道来。