> 백엔드 개발 > 파이썬 튜토리얼 > FastAPI가 API 호출을 병렬이 아닌 직렬로 실행하는 이유는 무엇입니까?

FastAPI가 API 호출을 병렬이 아닌 직렬로 실행하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-02 15:15:42
원래의
217명이 탐색했습니다.

Why Does FastAPI Execute API Calls Serially Instead of in Parallel?

FastAPI: API 호출이 병렬이 아닌 직렬로 실행되는 이유

FastAPI는 비동기와 비동기를 모두 사용하여 엔드포인트(경로 작업 함수라고도 함)를 정의합니다. 데프와 데프. 개념적으로 async def는 병렬화를 제안할 수 있지만 FastAPI는 실제로 이러한 기능을 다르게 처리합니다.

async def로 정의된 끝점:

  • 이벤트 루프에서 직접 실행합니다.
  • 다른 비동기 함수에서만 호출할 수 있으며 다음과 같은 비동기 작업을 실행하기 전에 일시 중지(대기)해야 합니다. I/O.
  • 이벤트 루프가 차단되지 않고 다른 작업이 동시에 실행될 수 있는지 확인하세요.

def:

    이벤트 루프에서 직접 실행하지
  • 않고 대신 별도의 스레드에서 실행 외부 스레드 풀.
  • 비동기 또는 비동기 함수에서 호출할 수 있습니다.
  • 비동기 작업이 일시 중지 없이 수행되는 경우 이벤트 루프를 차단하고 다른 작업이 실행되지 않도록 할 수 있습니다.
  • 특정 시나리오에서 성능 최적화를 제공합니다.

영향 병렬화:

이러한 이해를 바탕으로 코드 예제를 살펴보겠습니다.

@app.get("/ping")
async def ping(request: Request):
    print("Hello")
    time.sleep(5) # This sleeps the event loop for 5 seconds
    print("bye")
    return {"ping": "pong!"}
로그인 후 복사
이 경우 다음이 발생합니다.

    두 개의 요청 to /ping이 동시에 전송됩니다.
  • 비동기 defENDPOINT가 이벤트에서 직접 실행됩니다. loop.
  • time.sleep(5) 호출은 이벤트 루프를 5초 동안 일시 중지합니다.
  • 이 5초 동안 두 번째 요청은 대기열에 추가되며 이벤트 루프가 차단되므로 처리할 수 없습니다. .
  • 5초 후에 이벤트 루프가 재개되면 두 번째 요청은 다음과 같습니다. 처리됩니다.
결과적으로 응답은 연속적으로 인쇄됩니다.

Hello
bye
Hello
bye
로그인 후 복사
병렬화를 활성화하려면 time.sleep()과 같은 비동기 작업이

되어서는 안 됩니다 비동기 def 엔드포인트에서 사용됩니다. 대신 다음 접근 방식 중 하나를 적용할 수 있습니다.

    run_in_threadpool()을 사용하여 스레드를 생성하고 이벤트 루프 외부에서 차단 작업을 실행합니다.
  • loop.run_in_executor()를 사용합니다. 또는 asyncio.to_thread()를 사용하여 별도의 스레드나 프로세스에서 차단 작업을 실행합니다.
  • 사용을 고려하세요. ThreadPoolExecutor 또는 ProcessPoolExecutor는 계산 집약적인 작업을 프로세스 외부에서 실행합니다.

위 내용은 FastAPI가 API 호출을 병렬이 아닌 직렬로 실행하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿