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 중국어 웹사이트의 기타 관련 기사를 참조하세요!