Rumah >pembangunan bahagian belakang >Tutorial Python >Adakah HTTPX Alternatif Lebih Selamat kepada ThreadPoolExecutor dalam FastAPI Endpoints?
Kebimbangan Konkuren ThreadPoolExecutor Penggunaan dalam FastAPI Endpoints
Masalah:
Concurrent.future.future ThreadPoolExecutor digunakan untuk pemprosesan selari, tetapi terdapat kebimbangan mengenai potensi kesannya dalam titik akhir FastAPI. Khususnya, jika berbilang panggilan API mencetuskan penciptaan terlalu banyak rangkaian, ia boleh mengakibatkan keletihan sumber dan ranap sistem.
Penyelesaian:
Daripada bergantung pada ThreadPoolExecutor, Pustaka HTTPX mempersembahkan alternatif yang lebih selamat dengan API asyncnya. Menggunakan HTTPX, anda boleh mencipta Klien dan menggunakannya semula untuk berbilang permintaan. Untuk melaksanakan operasi tak segerak, AsyncClient disyorkan.
Konfigurasi HTTPX:
HTTPX membenarkan penyesuaian saiz kolam sambungan dan tetapan tamat masa. Contohnya:
limits = httpx.Limits(max_keepalive_connections=5, max_connections=10) async with httpx.AsyncClient(limits=limits) as client: ...
Laraskan had dan nilai tamat masa agar sesuai dengan keperluan khusus anda.
Pelaksanaan Permintaan Asynchronous:
Untuk menjadikan berbilang tak segerak permintaan, anda boleh menggunakan asyncio.gather(). Ia akan menunggu penyiapan setiap permintaan dan mengembalikan senarai keputusan dalam susunan yang sama seperti tugasan yang disediakan.
Pengurusan Kitaran Hayat:
Untuk mengendalikan peristiwa jangka hayat dalam Aplikasi FastAPI, pertimbangkan untuk menggunakan kebergantungan jangka hayat. Ini membolehkan anda memulakan dan membersihkan sumber, seperti klien HTTPX, apabila aplikasi dimulakan dan dimatikan.
Tindak Balas Penstriman:
Jika anda perlu mengelak memuatkan keseluruhan respons ke dalam memori, pertimbangkan untuk menggunakan keupayaan penstriman HTTPX dan StreamingResponse FastAPI. Ini membolehkan anda memproses sebahagian daripada data tindak balas secara berulang, memberikan kebolehskalaan yang lebih baik.
Contoh Kod:
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): # Custom settings client = httpx.AsyncClient(...) yield {'client': client} await client.aclose() # Close the client 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) # Process the responses as needed (e.g., extract data, modify content)
Atas ialah kandungan terperinci Adakah HTTPX Alternatif Lebih Selamat kepada ThreadPoolExecutor dalam FastAPI Endpoints?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!