FastAPI 및 병렬 실행
FastAPI의 비동기 프로그래밍
기본적으로 FastAPI는 비동기 프로그래밍 패턴을 사용하므로 다음을 수행할 수 있습니다. 여러 요청을 동시에 처리합니다. 구체적으로는 코루틴과 이벤트 루프를 사용하여 요청을 효율적으로 실행합니다.
Def vs. Async Def 함수
def(동기)로 정의된 함수를 처리합니다. 외부 스레드 풀 내의 별도 스레드에 있습니다. async def(asynchronous)로 정의된 함수는 이벤트 루프에서 직접 실행됩니다.
차단 코드 실행
문제: 차단 작업이 async def 엔드포인트 내에서 실행되면 이벤트 루프를 차단하고 요청을 직렬화할 수 있습니다. 처리.
해결책:
-
def:로 엔드포인트 정의: 엔드포인트에 비동기 작업이 필요하지 않은 경우 일반 def를 사용하여 차단을 방지하세요.
-
사용 run_in_threadpool(): async def 엔드포인트 내의 작업 차단의 경우 FastAPI run_in_threadpool() 함수를 사용하면 스레드 풀 내의 별도 스레드에서 작업을 실행하여 이벤트 루프 차단을 방지할 수 있습니다.
-
사용 asyncio.loop.run_in_executor(): 이 함수는 실행을 위해 run_in_threadpool()에 대한 대안을 제공합니다. 작업을 비동기적으로 차단합니다.
-
별도의 프로세스(ProcessPoolExecutor) 사용: CPU 집약적인 계산의 경우 병렬화를 최대화하기 위해 별도의 프로세스에서 작업을 실행하는 것이 좋습니다.
스레드 풀 방지 소진
- 여러 비동기 HTTP 요청을 병렬로 실행하려면 asyncio.gather()와 함께 httpx 라이브러리를 사용하세요.
- 여러 FastAPI 작업자(uvicorn --workers)를 사용하여 각각 자체 스레드 풀이 있는 여러 프로세스에 요청을 배포합니다.
- 다음과 같은 외부 작업 대기열 시스템 사용을 고려하세요. 과도한 백그라운드 계산을 위한 셀러리.
추가 참고 사항:
-
브라우저 캐싱: 시크릿 탭을 열거나 다른 브라우저를 사용하세요. API에 대한 브라우저 캐싱 효과를 방지하기 위한 세션
-
비동기 I/O: httpx 및 aiohttp와 같은 비동기 HTTP 클라이언트는 요청과 같은 동기 클라이언트보다 더 나은 성능을 제공합니다.
위 내용은 FastAPI는 어떻게 병렬 실행을 처리하고 작업 차단을 방지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!