자바칩

[FastAPI] async + await 구조가 동시성에 강한 이유 본문

Study

[FastAPI] async + await 구조가 동시성에 강한 이유

아기제이 2025. 4. 15. 15:48
728x90

async def + await 구조를 잘 쓰고 있다면,
FastAPI는 동시성을 아주 잘 처리한다.
즉, 여러 클라이언트가 동시에 요청해도 차례차례 막히지 않고 병렬 처리됨 (진짜 동시 실행은 아님 → 비동기 cooperative 방식임).


🔍 왜 async + await 구조가 동시성에 강한가?

📌 기본 원리:

  • Python의 asyncio 기반 구조는 non-blocking I/O를 전제로 함
  • await 키워드가 붙은 I/O 작업(MongoDB, HTTP 등)은 I/O가 끝나는 동안 다른 작업으로 컨텍스트를 넘김
  • 즉, 하나의 요청이 DB 응답을 기다리는 동안 다른 요청을 처리할 수 있음

✅ 동시성 보장되는 이유

@router.get("/records")
async def get_all_records(...):
    ...
    docs = await collection.find(...).to_list(...)
  • async def: 이 함수는 비동기 루프에 의해 관리됨
  • await collection.find(...): 이 부분에서 MongoDB 응답을 기다리는 동안 다른 요청을 처리할 수 있음
  • 따라서 여러 요청이 동시에 와도 → 동시에 처리 가능

💡 참고: 이 구조가 없다면?

만약 이런 구조 없이 일반 def 함수에서 블로킹 DB 호출을 하면...

  • 요청 1개가 처리되는 동안 나머지는 대기
  • 동시 요청 처리량 급감
  • Uvicorn + FastAPI 비동기 모델의 장점 상실

🚀 요약

조건 동시성 보장 설명
async def + await 사용 FastAPI가 asyncio 이벤트 루프로 비동기 I/O 처리
def + blocking I/O (ex. pymongo) 하나의 요청이 끝나야 다음 요청 처리됨

📌 실전 팁

  • MongoDB 드라이버로 motor를 쓰고 있다면 → 이미 비동기 지원 OK
  • 만약 CPU 바운드 연산(예: 이미지 처리, 대규모 데이터 계산 등)이 들어가면 async만으론 부족 → background task, process pool, celery 등 필요