Heim > Artikel > Backend-Entwicklung > Ist die Verwendung eines „concurrent.futures.ThreadPoolExecutor“ in einem FastAPI-Endpunkt riskant?
Ist es riskant, einen Concurrent.futures.ThreadPoolExecutor in einem FastAPI-Endpunkt zu verwenden?
Problemstellung:
Im bereitgestellten Testcode wird ein ThreadPoolExecutor verwendet, um Daten von mehreren Websites gleichzeitig abzurufen. Es besteht die Sorge, dass die Verwendung dieses Ansatzes in einem FastAPI-Endpunkt zu einer übermäßigen Thread-Erstellung und potenziellen Problemen wie Ressourcenknappheit und Anwendungsabstürzen führen könnte.
Bedenken und potenzielle Fallstricke:
Empfohlene Lösung: Verwendung der HTTPX-Bibliothek
Anstelle der Verwendung eines ThreadPoolExecutors ist es ratsam, die HTTPX-Bibliothek zu verwenden, die Folgendes bietet eine asynchrone API. HTTPX bietet eine Reihe von Vorteilen:
Arbeitsbeispiel:
from fastapi import FastAPI, Request from contextlib import asynccontextmanager import httpx import asyncio URLS = ['https://www.foxnews.com/', 'https://edition.cnn.com/', 'https://www.nbcnews.com/', 'https://www.bbc.co.uk/', 'https://www.reuters.com/'] @asynccontextmanager async def lifespan(app: FastAPI): # Customise settings limits = httpx.Limits(max_keepalive_connections=5, max_connections=10) timeout = httpx.Timeout(5.0, read=15.0) # 5s timeout on all operations # Initialise the Client on startup and add it to the state async with httpx.AsyncClient(limits=limits, timeout=timeout) as client: yield {'client': client} # The Client closes on shutdown app = FastAPI(lifespan=lifespan) async def send(url, client): return await client.get(url) @app.get('/') async def main(request: Request): client = request.state.client tasks = [send(url, client) for url in URLS] responses = await asyncio.gather(*tasks) return [r.text[:50] for r in responses] # For demo purposes, only return the first 50 chars of each response
Dieses Code-Snippet demonstriert die Verwendung von HTTPX mit FastAPI zur asynchronen Verarbeitung gleichzeitiger Anforderungen, wodurch die Bedenken im Zusammenhang mit Thread-Erschöpfung und Ressourcenkonflikten wirksam gemindert werden.
Das obige ist der detaillierte Inhalt vonIst die Verwendung eines „concurrent.futures.ThreadPoolExecutor“ in einem FastAPI-Endpunkt riskant?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!