Maison  >  Article  >  développement back-end  >  Pourquoi StreamingResponse de FastAPI ne diffuse-t-il pas de fonctions de générateur ?

Pourquoi StreamingResponse de FastAPI ne diffuse-t-il pas de fonctions de générateur ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-11 06:04:02354parcourir

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

FastAPI StreamingResponse ne diffuse pas de données avec la fonction de générateur

StreamingResponse de FastAPI est destiné à renvoyer les données au client dès qu'elles deviennent disponibles. Cependant, il a été signalé que StreamingResponse ne fonctionnait pas comme prévu lors de l'utilisation des fonctions du générateur. Cet article examinera les causes potentielles de ce problème et fournira une solution.

Opérations de blocage et fonctions de générateur

Les fonctions de générateur en Python peuvent définir une séquence de valeurs qui sont en a donné un à la fois. Cependant, si une opération de blocage (telle que time.sleep()) est effectuée dans une fonction génératrice, elle peut bloquer la boucle d'événements, empêchant FastAPI de diffuser des données vers le client.

Def vs. Async Def

FastAPI gère StreamingResponse différemment selon que la fonction génératrice utilise la syntaxe def ou async def. Si la fonction du générateur est définie à l'aide de la syntaxe async def, FastAPI suppose qu'il s'agit d'un générateur asynchrone et l'exécute dans un pool de threads ou un pool de tâches. Cependant, si la fonction génératrice utilise la syntaxe def, FastAPI la reconnaît comme un générateur de blocage et utilise iterate_in_threadpool() pour l'exécuter dans un thread séparé.

Approche recommandée

Pour éviter de bloquer les opérations et assurer un bon streaming, il est recommandé d'utiliser une fonction de générateur asynchrone (async def). Si nécessaire, toute opération de blocage doit être effectuée dans un pool de threads externe et attendue pour éviter de perturber la boucle d'événements.

Type de média de réponse

Dans certains cas, les navigateurs peuvent texte tampon/réponses simples pour vérifier le type MIME. Pour éviter cela, il est conseillé de spécifier un type de média différent, tel que text/event-stream, application/json, ou de définir l'en-tête X-Content-Type-Options sur nosniff.

Exemple

Voici un exemple d'application FastAPI fonctionnelle avec une fonction génératrice pour le streaming data :

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")

Conclusion

En évitant les opérations de blocage, en utilisant des fonctions de générateur asynchrone et en spécifiant le type de média approprié, vous pouvez vous assurer que FastAPI StreamingResponse fonctionne comme prévu , vous permettant de diffuser efficacement des données aux clients.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn