[FastAPI] async def vs def

alirz-pixel·2023년 5월 24일
0

아래의 내용은 FastAPI의 공식 문서를 보고 정리한 내용입니다.

결론 (async def vs def)

공식 문서에서는 아래의 사항에 따라 사용하라고 한다.

async def

  • 외부 라이브러리가 await을 지원할 경우 (비동기적 호출)
  • I/O 바운드 환경 (DB 조회 등)
  • 가벼운 CPU 바운드 환경이며 외부와의 통신이 없는 경우 (단순 연산)

def

  • 외부 라이브러리가 await을 지원하지 않을 경우 (동기적 호출)

Fastapi의 동작 방식

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와 관계없이 동시에 처리될 수 있다.

reference

0개의 댓글