FastAPI 비동기 라우터와 asyncio: 요청 처리의 동작 이해하기 | 세상의 모든 정보

FastAPI 비동기 라우터와 asyncio: 요청 처리의 동작 이해하기

FastAPI 비동기 라우터와 asyncio: 요청 처리의 동작 이해하기

FastAPI를 사용하여 비동기 라우터를 작성할 때, 여러 요청이 동시에 들어올 때의 동작에 대해 혼란스러울 수 있습니다. 특히, 비동기 함수 내에서 await asyncio.sleep(5)와 같은 코드가 있을 때, 예상한 동작과 다른 결과가 나타날 수 있습니다. 이번 글에서는 FastAPI 비동기 라우터의 동작 방식과 관련하여 발생할 수 있는 문제를 살펴보겠습니다.

비동기 라우터 설정

다음은 FastAPI에서 비동기 라우터를 설정한 예시입니다:

from fastapi import FastAPI
import asyncio

app = FastAPI()

@app.get("/h")
async def sss():
    print("init sss")
    await asyncio.sleep(5)
    print("end")
    return "입니다!"

예상되는 동작

위의 라우터는 /h 경로로 두 개의 요청을 보내면 다음과 같은 로그를 기대할 수 있습니다:

init sss
init sss
end
end

이러한 로그가 출력되기를 기대하는 이유는, 비동기 함수가 호출되면 다른 요청을 처리할 수 있기 때문입니다.

실제로 나타나는 동작

그러나 실제로 요청을 두 개 보내면 다음과 같은 로그가 출력됩니다:

init sss
end
init sss
end

이 결과는 첫 번째 요청이 처리되는 동안 두 번째 요청이 대기하게 됨을 보여줍니다.

원인 분석

이러한 동작의 원인은 FastAPI와 ASGI 서버의 요청 처리 방식과 관련이 있습니다. FastAPI는 비동기적으로 동작하지만, 요청을 처리하는 동안 실행되는 코드의 흐름은 다음과 같습니다:

  1. 첫 번째 요청이 들어오면 sss() 함수가 호출되고 "init sss"가 출력됩니다.
  2. await asyncio.sleep(5)가 호출되면 이 함수는 대기 상태로 전환됩니다. 이때, 이벤트 루프는 다른 작업을 처리할 수 있는 상태가 됩니다.
  3. 두 번째 요청이 들어오면 또 다른 sss() 함수가 호출되고 "init sss"가 출력됩니다.
  4. 첫 번째 요청의 await가 끝나기 전에 두 번째 요청이 끝나면 "end"가 출력됩니다.

하지만, 두 요청이 동시에 처리되기 위한 조건이 충족되지 않으면, 첫 번째 요청이 완료된 후에 두 번째 요청이 처리됩니다.

해결 방법

여러 요청을 비동기적으로 처리하기 위해서는 다음과 같은 방법을 사용할 수 있습니다:

  1. 서버 설정 확인: FastAPI 애플리케이션을 실행하는 서버가 비동기 요청을 효율적으로 처리할 수 있는지 확인합니다. 예를 들어, Uvicorn이나 Daphne와 같은 ASGI 서버를 사용해야 합니다.
  2. 비동기 작업 분리: 비동기 작업을 별도의 함수로 분리하여 더 많은 비동기 호출이 가능하도록 합니다.
  3. 테스트와 모니터링: 여러 요청을 동시에 보내어 애플리케이션의 성능을 테스트하고, 로그를 통해 요청 처리 과정을 모니터링합니다.

결론

FastAPI에서 비동기 라우터를 작성할 때, await 키워드의 중요성을 이해하는 것이 중요합니다. 비동기 처리가 가능하더라도, 요청이 동시에 처리되지 않는 경우가 발생할 수 있습니다. 이 문제를 해결하기 위해서는 서버의 설정, 비동기 작업 처리 방식, 그리고 적절한 테스트 방법을 고려해야 합니다. 비동기 프로그래밍의 이점을 최대한 활용하여 더욱 효율적이고 반응성이 뛰어난 웹 애플리케이션을 개발할 수 있습니다. 위의 정보를 바탕으로 비동기 라우터의 동작 방식을 이해하고, 더 나은 웹 개발 경험을 쌓으시기 바랍니다.

다음 이전

POST ADS1

POST ADS 2