비동기 제너레이터는 await 사이에서 값을 yield하고 async for가 소비해. Python 3.11의 asyncio.timeout은 블록 전체의 시간 경계를 만들며 이전 버전의 wait_for보다 여러 작업과 조합하기 쉬워.
task.cancel()은 다음 await에서 CancelledError를 일으켜. 정리 뒤에는 보통 다시 올려 취소를 삼키지 말고, 반드시 끝나야 하는 아주 작은 작업만 shield로 보호해.
cwkPippa에서 청크마다 __anext__를 wait_for로 감쌌다가 취소가 비동기 제너레이터를 닫은 사례처럼, 제한시간은 개별 next보다 전체 스트림 수명에 두는 편이 안전해.