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!