Async 반복 — async for / async generator
for x in seq 가 iterable 에 작동하듯, async for x in stream 이 async iterable 에 작동. async generator 는 단지 async def + yield 둘 다 가진 함수 — 각 yield 전에 await 가능. cwkPippa 의 chat 핸들러 작동 방식 — 응답 들어오는 대로 각 청크 yield.
asyncio.timeout — 현대 방법
3.11+ 가 현대 타임아웃 패턴으로 async with asyncio.timeout(seconds): 도입. 3.11 전엔 asyncio.wait_for(coro, timeout). 둘 다 본문이 시간 안에 안 끝나면 TimeoutError raise. timeout context manager 가 다른 async 코드와 합성 더 좋음.
취소 — 뭔가 멈춰야 할 때
task 는 task.cancel() 로 취소 가능. task 안에선 다음 await 지점에 CancelledError raise. 정리 위해 잡을 수 있지만 일반적으로 re-raise 해야. CancelledError 가 일반 예외 X — try/except Exception 안 잡음. 의도적 — 취소가 조용히 삼켜지면 안 됨.
shield — 취소에서 보호
asyncio.shield(coro) 가 안의 coroutine 을 외부에서 전파되는 취소에서 보호. 외부 task 취소되지만 shield 된 안의 거는 계속 실행. "abort 전에 이 중요한 레코드 쓰기 끝내" 에 유용.
__anext__ 를 asyncio.wait_for 로 절대 감싸지 마. 취소가 async generator 종료, 이후 next 호출이 복구 대신 StopIteration raise. 맞는 모양 — 각 청크 X, 전체 streaming 연산 둘레의 타임아웃 관리.