我有一个带有两个处理程序的简单 aiohttp 服务器。
第一个在中进行一些计算async for
环形。第二个仅返回文本响应。not_so_long_operation
以最慢的递归实现返回第 30 个斐波那契数,大约需要一秒钟。
def not_so_long_operation():
return fib(30)
class arange:
def __init__(self, n):
self.n = n
self.i = 0
async def __aiter__(self):
return self
async def __anext__(self):
i = self.i
self.i += 1
if self.i <= self.n:
return i
else:
raise StopAsyncIteration
# GET /
async def index(request):
print('request!')
l = []
async for i in arange(20):
print(i)
l.append(not_so_long_operation())
return aiohttp.web.Response(text='%d\n' % l[0])
# GET /lol/
async def lol(request):
print('request!')
return aiohttp.web.Response(text='just respond\n')
当我试图获取时/
进而/lol/
,只有当第一个完成时,它才会给我第二个响应。
我做错了什么以及如何使索引处理程序在每次迭代时释放 ioloop?
你的例子没有屈服点 (await
语句)用于任务之间的切换。
异步迭代器allows to use await
inside __aiter__
/__anext__
但不要将其自动插入到您的代码中。
Say,
class arange:
def __init__(self, n):
self.n = n
self.i = 0
async def __aiter__(self):
return self
async def __anext__(self):
i = self.i
self.i += 1
if self.i <= self.n:
await asyncio.sleep(0) # insert yield point
return i
else:
raise StopAsyncIteration
应该按您的预期工作。
在实际应用中很可能你不需要await asyncio.sleep(0)
调用,因为您将等待数据库访问和类似的活动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)