피드로 돌아가기
asyncio Pitfalls: The 3-Hour Bug
Dev.toDev.to
Backend

asyncio 기반 I/O 최적화로 API 요청 처리 시간 40초에서 2초로 단축

asyncio Pitfalls: The 3-Hour Bug

BAOFUFAN2026년 5월 1일5intermediate

Context

동기 방식의 sequential request 구조로 인해 200개 API 호출 시 40초 이상의 높은 Latency 발생. 단일 스레드 기반의 blocking I/O 한계로 인한 CPU 리소스 낭비 및 처리 효율 저하 상황.

Technical Solution

  • Single-threaded Event Loop 도입을 통한 Non-blocking Concurrency 구현
  • aiohttp 라이브러리 채택으로 네트워크 I/O 대기 시간 동안 제어권을 Event Loop에 반환하는 구조 설계
  • asyncio.gather를 활용한 다수 코루틴의 병렬 스케줄링으로 전체 실행 시간을 최장 요청 시간 수준으로 수렴
  • Synchronous Blocking Call 제거 및 불가피한 동기 작업 발생 시 loop.run_in_executor를 통한 Thread Pool offloading 적용
  • return_exceptions=True 설정을 통한 개별 태스크 예외 격리 및 전체 파이프라인의 가용성 확보
  • ClientTimeout 및 Retry 로직 구현으로 네트워크 불안정성에 대응하는 복원력 강화

Impact

  • 전체 API 데이터 fetch 소요 시간: 41.23s $\rightarrow$ 2s 미만으로 단축
  • 처리 효율: 200개 요청의 순차 처리에서 동시 처리 구조로 전환

1. async def 내부에 requests.get 같은 동기 blocking 함수 사용 여부 확인

2. asyncio.gather 사용 시 개별 태스크 실패가 전체 결과값 손실로 이어지는지 return_exceptions 옵션 검토

3. CPU bound 작업이나 legacy 동기 라이브러리 사용 시 ThreadPoolExecutor 연동 고려

4. 모든 async I/O 호출에 적절한 timeout 설정 및 재시도 메커니즘 적용 여부 점검

원문 읽기