【问题标题】:equivalent of @inlineCallbacks in Tornado?相当于龙卷风中的@inlineCallbacks?
【发布时间】:2012-06-27 12:36:58
【问题描述】:

我的 Tornado 应用中有很多代码,如下所示:

@tornado.web.asynchronous
def get(self):
    ...
    some_async_call(..., callback=self._step1)

def _step1(self, response):
    ...
    some_async_call(..., callback=self._step2)

def _step2(self, response):
    ...
    some_async_call(..., callback=self._finish_request)


def _finish_request(self, response):
    ...
    self.write(something)
    self.finish()

显然内联回调会大大简化代码,它看起来像:

@inlineCallbacks
@tornado.web.asynchronous
def get(self):
    ...
    response = yield some_async_call(...)
    ...
    response = yield some_async_call(...)
    ...
    response = yield some_async_call(...)
    ...
    self.write(something)
    self.finish()

有没有办法在 Tornado 中进行内联回调或以其他方式简化代码?

【问题讨论】:

    标签: python callback twisted tornado


    【解决方案1】:

    你甚至可以分解调用。

    我认为您所做的事情是一个接一个地调用异步调用,因此不会最大程度地改善延迟。

    如果调用没有任何依赖关系(例如,将一个调用的结果用于第二个调用),您可以同时启动所有调用:

    @tornado.web.asynchronous
    @gen.engine
    def get(self):
        responses = yield [ gen.Task(call) for call in required_calls ]
    

    这样,所有呼叫同时开始,因此您的整体延迟是最大(所有呼叫)而不是总和(所有呼叫)。

    我在一个需要聚合许多第三方 WS 或数据库调用的应用中使用了它,它大大改善了整体延迟。

    当然,如果调用之间存在依赖关系(如上所述),它就不起作用

    【讨论】:

    • 实际上在我的情况下调用不是独立的,它们之间还有一些额外的代码,但无论如何这是一个有趣的观察。
    【解决方案2】:

    找到了。在 Tornado 中,它不被称为内联回调,而是“基于生成器的接口”——tornado.gen。因此我的代码应该类似于:

    @tornado.web.asynchronous
    @gen.engine
    def get(self):
        ...
        response = yield gen.Task(some_async_call(...))
        ...
        response = yield gen.Task(some_async_call(...))
        ...
        response = yield gen.Task(some_async_call(...))
        ...
        self.write(something)
        self.finish()
    

    【讨论】:

    • 是的,这是自龙卷风版本2.1以来对您问题的直接回答。
    • @NikolayFominyh:我在 Tornado 2.0 的时候就开始使用了,升级时肯定错过了“新功能”;-)
    【解决方案3】:

    您也可以考虑只使用Cyclone,这样您就可以直接使用@inlineCallbacks(以及您想要的任何其他Twisted 代码)。

    【讨论】:

      猜你喜欢
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多