728x90
비동기 처리와 성능 최적화
강의 목표:
- FastAPI에서 비동기 처리를 이해하고 실시간 요청을 효율적으로 처리하는 방법을 학습한다.
- 비동기 작업을 사용하여 대량의 요청을 처리하는 API를 구현하고 성능을 최적화한다.
강의 세부 내용:
1. 비동기 처리의 개념
- 비동기 처리(Async): 요청과 응답 사이의 차단을 없애고, 여러 요청을 동시에 처리할 수 있도록 돕는 방식. FastAPI는 Python의 비동기 기능(async, await)을 지원하여 I/O 바운드 작업에서 높은 성능을 발휘할 수 있습니다.
- 동기 vs 비동기:
- 동기(Synchronous): 각 요청이 완료될 때까지 기다렸다가 다음 요청을 처리하는 방식.
- 비동기(Asynchronous): 요청을 비동기적으로 처리하여 여러 요청을 동시에 처리 가능.
2. 비동기 작업 구현하기
예제: 비동기 API 엔드포인트 구현
- 기본 비동기 처리 엔드포인트: 비동기 작업을 처리하는 FastAPI 엔드포인트를 구현하여 클라이언트 요청을 효율적으로 처리합니다.
from fastapi import FastAPI
import asyncio
app = FastAPI()
# 비동기 작업 구현
@app.get("/async_process")
async def async_process():
await asyncio.sleep(3) # 3초 대기하는 비동기 작업
return {"message": "Async process complete!"}
설명:
- async def: 비동기 함수 선언을 의미하며, 내부에서 await를 사용할 수 있습니다.
- await asyncio.sleep(3): 3초 동안 비동기적으로 대기하는 예제입니다. 동기적으로 대기하지 않고 다른 작업을 처리할 수 있게 해줍니다.
3. 비동기 API 성능 테스트:
비동기 엔드포인트 /async_process에 다수의 요청을 보낸 후 성능을 테스트합니다.
# curl로 비동기 요청을 동시에 보내기
for i in {1..5}; do curl http://127.0.0.1:8000/async_process & done
결과: 동시에 여러 요청을 보내도 비동기적으로 처리되므로 모든 요청이 비동기적으로 처리되며, 동시에 응답을 받을 수 있습니다.
3. 대량 요청 처리와 성능 최적화
FastAPI에서 성능 최적화 전략
- 비동기 작업 사용: CPU 바운드 작업보다 I/O 바운드 작업(예: 파일 읽기/쓰기, 데이터베이스 요청)에서 비동기 처리가 성능을 크게 개선합니다.
- async와 await 사용: 모든 I/O 작업(데이터베이스 쿼리, 파일 시스템 접근 등)을 async로 처리하면 동시성을 높일 수 있습니다.
- 다중 프로세싱: FastAPI와 Uvicorn에서 다중 워커를 설정하여 여러 프로세스가 동시에 요청을 처리하도록 설정합니다.
- Uvicorn 워커 설정:
uvicorn main:app --workers 4
- 워커 수를 늘리면 더 많은 요청을 동시에 처리할 수 있습니다.
- Uvicorn 워커 설정:
4. 비동기 작업 큐 구현
예제: 비동기 작업 큐 구현
대량의 요청을 처리할 때, 큐를 사용하여 작업을 비동기적으로 처리하는 방법을 설명합니다.
import asyncio
from fastapi import FastAPI, BackgroundTasks
app = FastAPI()
# 비동기 작업을 백그라운드에서 처리
async def async_task(message: str):
await asyncio.sleep(5) # 5초 후에 완료
print(f"Task completed: {message}")
# 백그라운드 작업 처리 엔드포인트
@app.post("/background_task")
async def background_task(message: str, background_tasks: BackgroundTasks):
background_tasks.add_task(async_task, message)
return {"message": "Task submitted"}
설명:
- BackgroundTasks: FastAPI에서 비동기 작업을 백그라운드에서 처리할 수 있게 해주는 기능.
- 클라이언트는 비동기 작업이 완료되기 전에 응답을 받을 수 있으며, 서버는 작업을 백그라운드에서 처리합니다.
백그라운드 작업 테스트:
curl -X POST "http://127.0.0.1:8000/background_task" -d "message=Hello World"
서버는 즉시 응답하고, 5초 후 작업이 완료되었다는 메시지가 출력됩니다.
5. 성능 테스트 및 모니터링
1. 성능 테스트 도구:
- locust: 대규모 성능 테스트를 위한 오픈 소스 도구로, FastAPI 서버에 대량의 요청을 보내 성능을 측정합니다.
pip install locust
- locustfile.py 예시:
from locust import HttpUser, task class LoadTestUser(HttpUser): @task def async_process(self): self.client.get("/async_process")
- 서버에서 대량의 비동기 요청을 처리하는 성능을 확인할 수 있습니다.
2. 성능 모니터링:
- Uvicorn 로그: Uvicorn 서버는 기본적으로 요청 처리 시간과 응답 시간을 로그로 제공합니다. 이를 활용해 병목 현상과 비동기 처리의 성능을 모니터링할 수 있습니다.
마무리 및 추가 학습
- 이번 강의에서는 FastAPI에서 비동기 작업을 처리하는 방법을 학습하고, 실시간으로 많은 요청을 처리할 수 있는 성능 최적화 전략을 살펴봤습니다.
- 다음 강의에서는 데이터베이스 연동과 비동기 쿼리 처리를 다룰 예정입니다.
728x90
'FastAPI' 카테고리의 다른 글
FastAPI 강좌 7강: Kubernetes를 활용한 애플리케이션 배포 (0) | 2024.10.09 |
---|---|
FastAPI 강좌 6강: 도커를 사용한 FastAPI 애플리케이션 컨테이너화 (0) | 2024.10.09 |
FastAPI 강좌 4강: 데이터 분석 결과 API 구현 (0) | 2024.10.09 |
FastAPI 강좌 3강: 데이터 처리와 Pandas 연동 (4) | 2024.10.09 |
FastAPI 강좌 2강: 데이터 수집 API 구현 (0) | 2024.10.09 |