Python 3 asyncio 프레임 워크를 사용하여 주기적으로 실행되는 패턴 (실제 sleep/delay는 생략하지 않음)을 평가하고 있으며 두 가지 코드가 서로 다르게 동작합니다 왜 그런지 설명 할 수 없습니다. 첫 번째 버전은 yield from
을 호출하여 예상대로 반복적으로 약 1000 회의 반복으로 스택을 소모합니다. 두 번째 버전에서는 coroutine을 재귀 적으로 호출하지만 실제 이벤트 루프 실행을 asyncio.async
으로 위임하고 스택을 소모하지 않습니다. 스택이 두 번째 버전에서 사용되지 않는 이유를 자세히 설명 할 수 있습니까? 이 코 루틴을 실행하는 두 가지 방법의 차이점은 무엇입니까?파이썬 3 asyncio - vs asyncio.async 스택 사용량에서 yield
첫 번째 버전 (발 수율)
@asyncio.coroutine
def call_self(self, i):
print('calling self', i)
yield from self.call_self(i + 1)
번째 버전 (asyncio.async)
@asyncio.coroutine
def call_self(self, i):
print('calling self', i)
asyncio.async(self.call_self(i + 1))
실행 해 보셨습니까? 두 번째 버전은 몇 번만 인쇄합니다 ('loop.run_until_complete (self.call_self (0))'로 실행하면 한 번만 출력 될 것입니다) – jfs
@JFSebastian 실제로 실행하려고 시도 했으므로 run_until_complete하지만 run_forever로 실행하지 마십시오. 이 두 가지 모두 run_forever로 무한히 인쇄하려고 시도하지만, 첫 번째는 스택을 소모하고 두 번째 스택은 영원히 (2 백만 +) 실행됩니다. –
그런 다음 run_until_complete()를 사용하여 두 변종을 실행하려고 시도합니다. 결과 기다리는 것과 코 루틴을 예약하는 것의 차이점을 보여줍니다. – jfs