【发布时间】:2017-01-09 18:47:14
【问题描述】:
我来自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 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
我对如何正确迭代循环中的每个元素以使事件循环不被阻塞感到困惑。有谁知道这样做的“龙卷风”方式?
【问题讨论】:
标签: python python-3.x asynchronous tornado coroutine