2 つのハンドラーを持つ単純な aiohttp-server があります。async for
まず、ループ内でいくつかの計算を行います。2 つ目は、テキスト応答を返すだけです。not_so_long_operation
再帰的な実装が最も遅く、約 1 秒かかる 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/
、最初のものが終了したときにのみ、2 番目の応答が返されます。
私は何を間違っていますか? また、反復ごとにインデックス ハンドラーが ioloop を解放する方法を教えてください。