Python与龙卷风 - 类实现与太多异步

时间:2013-10-10 22:15:30

标签: python asynchronous tornado

让我们从一些例子开始吧。有库tornado-redis,下面是使用它的示例。

import tornadoredis
import tornado.web
import tornado.gen

c = tornadoredis.Client()
c.connect()

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.engine
    def get(self):
        foo = yield tornado.gen.Task(c.get, 'foo')
        bar = yield tornado.gen.Task(c.get, 'bar')
        zar = yield tornado.gen.Task(c.get, 'zar')
        self.set_header('Content-Type', 'text/html')
        self.render("template.html", title="Simple demo", foo=foo, bar=bar, zar=zar)

一切都很简单。但我需要编写一个包装类。为我编码没有问题,但我认为我误认为是异步模式。

我的包装类应该异步调用redis类,对吧!?现在我是否必须以处理程序可以使用Task(异步)调用它的方式异步实现我的类?然后我会有两个异步的地方。 什么是保持Tronado异步并保持简单的正确方法?

Handler --async call--> MyWrapper --async call--> tronado-redis

Handler --sync call--> MyWrapper --async call--> tronado-redis

Handler --async call--> MyWrapper --sync call--> tronado-redis

1 个答案:

答案 0 :(得分:1)

异步函数只能由其他异步函数调用。由于tornado-redis是异步的,因此RequestHandler及其间的所有内容也必须是异步的。

请注意,@tornado.web.asynchronous装饰器仅用于RequestHandler方法 - 要在RequestHandler之外创建异步方法,您可以单独使用@gen.coroutine@gen.engine