FastAPI StreamingResponse는 생성기 기능으로 스트리밍되지 않음
FastAPI의 StreamingResponse는 데이터가 제공되면 클라이언트로 다시 스트리밍하기 위한 것입니다. 그러나 생성기 기능을 사용할 때 StreamingResponse가 예상대로 작동하지 않는다는 보고가 있었습니다. 이 문서에서는 이 문제의 잠재적인 원인을 조사하고 해결책을 제공할 것입니다.
차단 작업 및 생성기 함수
Python의 생성기 함수는 다음과 같은 값 시퀀스를 정의할 수 있습니다. 한 번에 하나씩 내놓았습니다. 그러나 생성기 함수 내에서 차단 작업(예: time.sleep())이 수행되면 이벤트 루프가 차단되어 FastAPI가 클라이언트로 데이터를 스트리밍하지 못하게 될 수 있습니다.
Def vs. Async Def
FastAPI는 생성기 함수가 def 또는 async def 구문을 사용하는지 여부에 따라 StreamingResponse를 다르게 처리합니다. 생성기 함수가 async def 구문을 사용하여 정의된 경우 FastAPI는 이를 비동기 생성기로 가정하고 스레드 풀 또는 작업 풀에서 실행합니다. 하지만 생성기 함수가 def 구문을 사용하는 경우 FastAPI는 이를 차단 생성기로 인식하고 iterate_in_threadpool()을 사용하여 별도의 스레드에서 실행합니다.
권장 접근 방식
작업 차단을 방지하고 적절한 스트리밍을 보장하려면 비동기 생성기 기능(async def)을 사용하는 것이 좋습니다. 필요한 경우 모든 차단 작업은 외부 스레드 풀에서 수행되어야 하며 이벤트 루프가 중단되지 않도록 기다려야 합니다.
응답 미디어 유형
어떤 경우에는 브라우저가 MIME 유형을 확인하기 위한 버퍼 텍스트/일반 응답. 이를 방지하려면 text/event-stream, application/json 등 다른 미디어 유형을 지정하거나 X-Content-Type-Options 헤더를 nosniff로 설정하는 것이 좋습니다.
예
다음은 스트리밍 데이터용 생성기 기능을 갖춘 작동하는 FastAPI 앱의 예입니다.
from fastapi import FastAPI, StreamingResponse, Request from fastapi.responses import HTMLResponse import asyncio app = FastAPI() @app.get("/stream") async def streaming_data(request: Request): def generate_data(): for i in range(10): yield b'some fake data\n\n' await asyncio.sleep(0.5) return StreamingResponse(generate_data(), media_type="text/event-stream")
결론
차단 작업 방지 , 비동기 생성기 기능을 사용하고 적절한 미디어 유형을 지정하면 FastAPI StreamingResponse가 의도한 대로 작동하는지 확인하여 클라이언트에 데이터를 효율적으로 스트리밍할 수 있습니다.
위 내용은 FastAPI의 StreamingResponse가 생성기 기능으로 스트리밍되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!