> 백엔드 개발 > 파이썬 튜토리얼 > 내 FastAPI 애플리케이션이 동시 요청을 병렬이 아닌 순차적으로 처리하는 이유는 무엇입니까?

내 FastAPI 애플리케이션이 동시 요청을 병렬이 아닌 순차적으로 처리하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-01 01:12:09
원래의
618명이 탐색했습니다.

Why Does My FastAPI Application Process Concurrent Requests Sequentially Instead of in Parallel?

FastAPI는 병렬 방식이 아닌 직렬 방식으로 API 호출을 실행합니다

문제 설명:

FastAPI는 병렬 기능을 제공하지만 API 여러 브라우저 탭을 통해 동시에 이루어진 호출은 병렬이 아닌 순차적으로 처리됩니다. 이 동작은 async def가 아닌 def로 엔드포인트를 정의할 때 발생합니다.

분석 및 솔루션:

FastAPI는 외부 스레드 풀을 활용하여 def로 정의된 엔드포인트를 처리합니다. 이러한 엔드포인트가 요청을 받으면 FastAPI는 스레드 풀과 별도의 스레드에서 요청을 실행합니다. 그러나 한 번에 하나의 요청만 처리할 수 있으므로 진정한 병렬 처리가 아닌 순차적 요청 처리가 이루어집니다.

반대로 async def로 정의된 엔드포인트는 기본 이벤트 루프에서 직접 실행되므로 진정한 병렬 요청 처리가 가능합니다. . 이는 비동기 def 엔드포인트 내의 대기 호출이 비동기 작업을 기다리는 동안 이벤트 루프의 다른 작업을 양보하기 때문입니다.

문제를 해결하려면 I/O 바인딩 작업 차단이 필요하지 않은 엔드포인트가 정의되었는지 확인하세요. FastAPI의 병렬 기능을 활용하려면 async def를 사용하세요. 다음은 병렬로 실행할 수 있는 엔드포인트의 예입니다.

@app.get("/ping")
async def ping(request: Request):
    print("Hello")
    await asyncio.sleep(5)
    print("bye")
    return {"ping": "pong!"}
로그인 후 복사

추가 정보:

  • time.sleep()과 같은 차단 작업, async def 엔드포인트에서는 전체 서버를 차단하여 병렬 처리의 이점을 제공합니다. 비효율적입니다.
  • CPU 바인딩 작업 또는 차단 I/O 작업은 run_in_threadpool(), loop.run_in_executor(), ThreadPoolExecutor 또는 ProcessPoolExecutor와 같은 기술을 사용하여 별도의 스레드나 프로세스에서 실행될 수 있습니다.
  • 작업자(프로세스) 수를 늘리면 동시성을 향상하고 더 많은 요청을 처리할 수 있습니다.
  • 백그라운드 계산량이 많은 경우 apscheduler의 Celery 또는 AsyncIOScheduler와 같은 도구를 사용하는 것이 좋습니다.

위 내용은 내 FastAPI 애플리케이션이 동시 요청을 병렬이 아닌 순차적으로 처리하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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