gpt4 book ai didi

python - 使用 await 或 yield 迭代循环会导致错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:32 24 4
gpt4 key购买 nike

我来自Twisted/Klein 的土地.我平静地来寻求 Tornado 帮助。我正在研究 Tornado 以及它对异步的看法与 Twisted 有何不同。 Twisted 有一些类似于 gen.coroutine 的东西,它是 defer.inlineCallbacks而且我能够像这样编写异步代码:

kleinsample.py

@app.route('/endpoint/<int:n>')
@defer.inlineCallbacks
def myRoute(request, n):
jsonlist = []
for i in range(n):
yield jsonlist.append({'id': i})
return json.dumps(jsonlist)

curl 命令:

curl localhost:9000/json/2000

此端点将创建一个包含 n 个元素的 JSON 字符串。 n 可以很小也可以很大。我能够在 Twisted 中将其分解,这样事件循环就不会使用 yield 阻塞。下面是我尝试将其转换为 Tornado 的方法:

tornadosample.py

async def get(self, n):
jsonlist = []
for i in range(n):
await gen.Task(jsonlist.append, {'id': i}) # exception here
self.write(json.dumps(jsonlist))

回溯:

 TypeError: append() takes no keyword arguments

我很困惑我应该做什么来正确地迭代循环中的每个元素,这样事件循环就不会被阻塞。有谁知道这样做的“ Tornado ”方式?

最佳答案

您不能也不能等待 append,因为它不是协程并且不返回 Future。如果您想偶尔屈服以允许其他协同程序继续使用 Tornado 的事件循环,请等待 gen.moment .

from tornado import gen

async def get(self, n):
jsonlist = []
for i in range(n):
jsonlist.append({'id': i})
if not i % 1000: # Yield control for a moment every 1k ops
await gen.moment
return json.dumps(jsonlist)

就是说,除非此函数非常占用 CPU 并且需要数百毫秒或更长时间才能完成,否则您最好一次完成所有计算,而不是多次执行函数返回之前的事件循环。

关于python - 使用 await 或 yield 迭代循环会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39279064/

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