我来自Twisted
/^{gen.coroutine
,即^{
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)
卷曲命令:
^{pr2}$这个端点将创建一个JSON字符串,其中包含n
个元素。n
可以很小也可以很大。我可以在Twisted中分解它,这样事件循环就不会使用yield
阻塞。现在我试着把它变成龙卷风:
龙卷风样本.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
我不知道该怎么做才能正确地迭代循环中的每个元素,这样事件循环就不会被阻塞。有人知道这种“龙卷风”的方式吗?在
让我们来看看
gen.Task
docs:由于
append
不接受关键字参数,它不知道如何处理callback
kwarg并抛出该异常。在您可以使用自己的函数包装
append
,该函数接受callback
kwarg或{a2}答案中显示的方法。在list.append()
返回None
,因此Klein示例看起来像是在生成某个对象,这有点误导性。这相当于jsonlist.append(...); yield
作为两个单独的语句。龙卷风的等效物是做await gen.moment
来代替裸露的yield
。在还要注意,在Tornado中,处理程序通过调用
self.write()
而不是返回值来生成响应,因此return
语句应该是self.write(json.dumps(jsonlist))
。在您不能也不能等待
append
,因为它不是一个协同程序,也不会返回未来。如果您想偶尔让步以允许其他协同程序使用Tornado的事件循环继续,请等待gen.moment。在也就是说,除非这个函数是CPU密集型函数,并且需要几百毫秒或更长的时间才能完成,否则最好是一次完成所有的计算,而不是在函数返回之前多次遍历事件循环。在
相关问题 更多 >
编程相关推荐