FastAPI: Mengapa Panggilan API Dilaksanakan Secara Bersiri Daripada Selari
FastAPI mentakrifkan titik akhir (juga dikenali sebagai fungsi operasi laluan) menggunakan kedua-dua async def dan def. Walaupun secara konsep async def mungkin mencadangkan paralelisasi, FastAPI sebenarnya mengendalikan fungsi ini secara berbeza:
Titik Akhir Ditakrifkan dengan async def:
- Jalankan terus dalam gelung acara.
- Hanya boleh dipanggil daripada fungsi async lain dan mesti berhenti seketika (menunggu) sebelum melaksanakan operasi bukan async, seperti I/O.
- Pastikan gelung peristiwa tidak disekat dan tugas lain boleh dilaksanakan serentak.
Titik Akhir Ditakrifkan dengan def :
- Lari bukan secara langsung dalam gelung acara tetapi sebaliknya dalam urutan berasingan daripada kumpulan benang luaran.
- Boleh dipanggil daripada sama ada fungsi async atau bukan async.
- Boleh menyekat gelung peristiwa dan menghalang tugas lain daripada dilaksanakan jika operasi bukan segerak dilakukan tanpa menjeda.
- Tawarkan pengoptimuman prestasi dalam tertentu senario.
Impak terhadap Keselarian:
Berdasarkan pemahaman ini, mari kita periksa contoh kod anda:
@app.get("/ping")
async def ping(request: Request):
print("Hello")
time.sleep(5) # This sleeps the event loop for 5 seconds
print("bye")
return {"ping": "pong!"}
Salin selepas log masuk
Dalam kes ini , perkara berikut berlaku:
- Dua permintaan untuk /ping ialah dihantar serentak.
- defENDPOINT tak segerak berjalan terus dalam gelung acara.
- Panggilan time.sleep(5) menjeda gelung acara selama 5 saat.
- Sepanjang 5 ini saat, permintaan kedua dibariskan dalam baris gilir dan tidak boleh diproses kerana gelung acara disekat.
- Setelah gelung acara disambung semula selepas 5 saat, permintaan kedua diproses.
Hasilnya, respons dicetak secara bersiri:
Hello
bye
Hello
bye
Salin selepas log masuk
Untuk mendayakan penyejajaran, operasi tidak segerak seperti time.sleep() tidak boleh digunakan dalam titik akhir async def. Sebaliknya, salah satu daripada pendekatan berikut boleh digunakan:
- Gunakan run_in_threadpool() untuk menghasilkan benang dan laksanakan operasi menyekat di luar gelung acara.
- Gunakan loop.run_in_executor() atau asyncio.to_thread() untuk menjalankan operasi menyekat dalam benang berasingan atau proses.
- Pertimbangkan untuk menggunakan ThreadPoolExecutor atau ProcessPoolExecutor untuk menjalankan tugas intensif secara pengiraan di luar proses.
Atas ialah kandungan terperinci Mengapa FastAPI Melaksanakan Panggilan API Secara Bersiri Daripada Selari?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!