gpt4 book ai didi

python - 相当于 Tornado 中的@inlineCallbacks?

转载 作者:行者123 更新时间:2023-11-28 20:26:34 25 4
gpt4 key购买 nike

我的 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 中进行内联回调或以其他方式简化代码?

最佳答案

您甚至可以分解调用。

我认为您所做的是一个接一个地调用异步调用,因此没有提供最大的延迟改进。

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

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

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

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

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

关于python - 相当于 Tornado 中的@inlineCallbacks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11226383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com