피드로 돌아가기
Dev.toBackend
원문 읽기
Blocking I/O 제거를 통한 50개 도메인 체크 시간 50s에서 1.5s로 단축
The asyncio Mistake That Cost Me 3 Hours
AI 요약
Context
내부 운영 플랫폼의 배치 도메인 상태 확인 기능 구현 중 1,000개 이상의 도메인을 주기적으로 폴링하는 요구사항 발생. asyncio.gather를 적용했음에도 불구하고 동기식 순차 요청과 동일한 성능 저하가 나타난 병목 지점 분석.
Technical Solution
- Single-threaded Event Loop 구조에서 동기 라이브러리인 requests.get 사용으로 인한 Event Loop Blocking 문제 파악
- async def 정의만으로는 동시성을 보장하지 못하며, 실제 I/O 제어권을 반환하는 await 지점의 비동기 구현체 필요성 확인
- requests를 비동기 HTTP 라이브러리인 aiohttp로 교체하여 Socket I/O 대기 시간 동안 Event Loop가 다른 Task를 처리하는 구조로 변경
- aiohttp.ClientSession을 통한 Connection Pooling 적용으로 HTTP 요청 효율 최적화
- asyncio.gather의 기본 예외 처리 동작으로 인한 일부 Task 실패 시 전체 예외 전파 및 나머지 Task 상태 추적 불가 지점 식별
실천 포인트
1. asyncio 환경에서 requests, os.sleep 등 Blocking Call 사용 여부 전수 조사
2. I/O bound 작업 시 aiohttp, httpx 등 Non-blocking 라이브러리 적용 검토
3. asyncio.gather 사용 시 개별 Task의 Exception 격리 전략 수립 및 에러 핸들링 로직 검증