Python 3 asyncio フレームワークを使用して、定期的な実行 (簡潔にするために実際のスリープ/遅延は省略) のさまざまなパターンを評価していますが、動作が異なる 2 つのコードがあり、その理由を説明できません。自分自身を再帰的に呼び出すために使用する最初のバージョンは、yield from
予想どおり、約 1000 回の反復でスタックを使い果たしました。2 番目のバージョンは、コルーチンを再帰的に呼び出しますが、実際のイベント ループの実行を委譲asyncio.async
し、スタックを使い果たしません。スタックが 2 番目のバージョンで使用されていない理由を詳しく説明できますか? このコルーチンを実行する 2 つの方法の違いは何ですか?
最初のバージョン (からの利回り):
@asyncio.coroutine
def call_self(self, i):
print('calling self', i)
yield from self.call_self(i + 1)
2 番目のバージョン (asyncio.async):
@asyncio.coroutine
def call_self(self, i):
print('calling self', i)
asyncio.async(self.call_self(i + 1))