자바칩
[FastAPI] async + await 구조가 동시성에 강한 이유 본문
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 등 필요
'Study' 카테고리의 다른 글
비동기(Asynchronous) vs 멀티스레드(Multi-threading) (0) | 2025.04.15 |
---|---|
[Spring] Spring Boot에서 동시성 처리 방법 (0) | 2025.04.15 |
RDBMS 용어와 NoSQL 용어 비교 (0) | 2025.04.02 |
[Flask] json.dumps() vs jsonify() (0) | 2025.03.31 |
Dockerfile을 이용하여 이미지를 빌드하기 (0) | 2025.03.25 |