>  기사  >  백엔드 개발  >  FastAPI의 StreamingResponse가 생성기 기능으로 스트리밍되지 않는 이유는 무엇입니까?

FastAPI의 StreamingResponse가 생성기 기능으로 스트리밍되지 않는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-11 06:04:02315검색

Why is FastAPI's StreamingResponse Not Streaming with Generator Functions?

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.