아래의 내용은 FastAPI의 공식 문서를 보고 정리한 내용입니다.
공식 문서에서는 아래의 사항에 따라 사용하라고 한다.
async def
- 외부 라이브러리가 await을 지원할 경우 (비동기적 호출)
- I/O 바운드 환경 (DB 조회 등)
- 가벼운 CPU 바운드 환경이며 외부와의 통신이 없는 경우 (단순 연산)
def
- 외부 라이브러리가 await을 지원하지 않을 경우 (동기적 호출)
FastAPI는 async def
함수를 이벤트 루프에서 직접 실행한다.
def
함수는 별도의 쓰레드풀 (ThreadPoolExecutor)에서 실행한다. 따라서 가벼운 CPU-Bound 환경에서는 컨텍스트 스위칭 등의 오버헤드가 발생할 수 있다.
즉, def 함수는 await을 지원하지 않는 동기 I/O 라이브러리를 사용해야 하는 환경에서 사용해야 한다.
다음과 같은 환경이라고 가정
- uvicorn + FastAPI
- Worker = 1
- 컴퓨팅 환경은 충분하다고 가정
위의 예시의 환경이라면, FastAPI의 프로세스는 1개이며 해당 프로세스에는 하나의 이벤트 루프가 있는 것이다. 이 이벤트 루프는 async def
요청을 받아 스케줄링 되며, await로 I/O를 대기할 때는 다른 async def
을 처리한다.
그러나 def
는 별도의 쓰레드 풀에서 처리하기 때문에 async def
와 관계없이 동시에 처리될 수 있다.