Asyncio
이 파트는 `async def` 문법 설명보다, 실제 서비스에서 비동기 시스템을 안전하게 굴리는 감각을 다룬다. event loop, task, cancellation, timeout, backpressure, debug mode를 한 그림으로 이해해야 FastAPI endpoint, background worker, fan-out 호출, 큐 소비기가 안정적으로 돌아간다.
빠른 요약: 좋은 asyncio 코드는 "동시에 많이 돌린다"보다 "취소와 정리를 제대로 하고, 입력량을 통제하고, 숨은 blocking I/O를 제거한다"에 가깝다. 구조적 동시성과 backpressure를 모르면 async는 금방 불안정해진다.
이 파트에서 잡아야 할 질문
task는 언제 생기나
coroutine object와 scheduled task는 다르다. 무엇이 실제로 event loop에 올라갔는지 구분할 수 있어야 한다.
취소는 예외다
cancel은 신호가 아니라 `CancelledError` 전파 모델이다. cleanup과 재전파를 이해해야 shutdown이 깨지지 않는다.
백프레셔는 필수다
queue maxsize, semaphore, timeout 없이 무한 fan-out을 하면 메모리와 downstream이 먼저 터진다.
테스트는 타이밍 제어다
async 버그는 재현보다 관측이 어렵다. timeout, debug mode, task leak 체크가 필요하다.
추천 순서
실전 규칙
- task를 만들었다면 누가 기다리고 누가 취소하는지 분명해야 한다.
- blocking 함수는 event loop 안에서 직접 호출하지 않는다.
- queue 크기와 동시 실행 수는 항상 제한한다.
- timeout과 cleanup path를 정상 경로만큼 중요하게 다룬다.