본문으로 건너뛰기

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 체크가 필요하다.

추천 순서

  1. Event Loop and Tasks
  2. Cancellation and TaskGroup
  3. Queues and Backpressure
  4. Testing and Debugging

실전 규칙

  • task를 만들었다면 누가 기다리고 누가 취소하는지 분명해야 한다.
  • blocking 함수는 event loop 안에서 직접 호출하지 않는다.
  • queue 크기와 동시 실행 수는 항상 제한한다.
  • timeout과 cleanup path를 정상 경로만큼 중요하게 다룬다.

VitePress로 빌드한 Python 3.14 핸드북