Python?FastApi結(jié)合異步執(zhí)行方式
Python FastApi結(jié)合異步執(zhí)行
需求說(shuō)明
在使用fastApi框架的時(shí)候,往往程序會(huì)卡到uvicorn.run方法的執(zhí)行步驟,從而其下面同步執(zhí)行的動(dòng)作不能被執(zhí)行,此時(shí)需要使用異步思維進(jìn)行其他動(dòng)作的執(zhí)行;
代碼
- Web.py
from fastapi import FastAPI app = FastAPI() @app.get("/info") async def info(): return {"key": "HelloWorld"}
- WebMain.py
import uvicorn from threading import Thread from time import sleep def my_async(f): def wrapper(*args, **kwargs): thr = Thread(target=f, args=args, kwargs=kwargs) thr.start() return wrapper @my_async def print_info(): sleep(5) print("############test") if __name__ == '__main__': # 放在uvicorn.run前面,不然走不到此方法; print_info() uvicorn.run(app='Web:app', host='127.0.0.1', port=8000, reload=True, debug=True)
在FastApi中實(shí)現(xiàn)異步問(wèn)題
在FastAPI應(yīng)用中使用異步特性可以提高并發(fā)性能,但如果您要調(diào)用的模型是同步的,可能會(huì)導(dǎo)致阻塞。
為了實(shí)現(xiàn)異步處理,您可以將阻塞的操作委托給線程池或進(jìn)程池,以便異步執(zhí)行。
以下是一種基本方法來(lái)實(shí)現(xiàn)異步處理圖片識(shí)別任務(wù):
from fastapi import FastAPI from concurrent.futures import ThreadPoolExecutor import asyncio app = FastAPI() executor = ThreadPoolExecutor(max_workers=10) # 創(chuàng)建線程池,可以根據(jù)需求調(diào)整線程數(shù) # 模擬一個(gè)阻塞的圖片識(shí)別函數(shù) def blocking_image_recognition(image_data): # 模擬耗時(shí)操作,實(shí)際中會(huì)調(diào)用模型進(jìn)行識(shí)別 asyncio.sleep(5) return f"Recognized: {image_data}" @app.post("/recognize-image") async def recognize_image(image_data: str): # 使用線程池異步執(zhí)行阻塞操作 loop = asyncio.get_event_loop() result = await loop.run_in_executor(executor, blocking_image_recognition, image_data) # 此處可以將結(jié)果保存到數(shù)據(jù)庫(kù)或進(jìn)行其他操作 # 使用異步方式進(jìn)行數(shù)據(jù)庫(kù)操作 # ... return {"result": result}
在上述示例中,我們使用ThreadPoolExecutor創(chuàng)建了一個(gè)線程池,用于異步執(zhí)行阻塞操作。blocking_image_recognition函數(shù)模擬了一個(gè)耗時(shí)的識(shí)別操作,實(shí)際中會(huì)根據(jù)模型來(lái)實(shí)現(xiàn)。在recognize_image路由中,我們使用loop.run_in_executor將阻塞操作交給線程池來(lái)異步執(zhí)行。
在處理識(shí)別結(jié)果時(shí),您可以使用異步框架(例如Tortoise-ORM)來(lái)保存數(shù)據(jù)到數(shù)據(jù)庫(kù),確保數(shù)據(jù)庫(kù)操作也是非阻塞的。這樣,您就可以同時(shí)處理多個(gè)圖片識(shí)別任務(wù),提高并發(fā)性能。
如果需要更高級(jí)的并發(fā)控制,您還可以考慮使用異步任務(wù)隊(duì)列(例如Celery)來(lái)進(jìn)一步分布式處理圖片識(shí)別任務(wù)。 Celery允許您在多個(gè)遠(yuǎn)程機(jī)器上并行執(zhí)行任務(wù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Pandas 類型轉(zhuǎn)換astype()的實(shí)現(xiàn)
本文主要介紹了Pandas 類型轉(zhuǎn)換astype()的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07python讀取測(cè)試數(shù)據(jù)的多種方式
本文主要介紹了python讀取測(cè)試數(shù)據(jù)的多種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08pygame實(shí)現(xiàn)俄羅斯方塊游戲(AI篇1)
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)俄羅斯方塊游戲AI的第1篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10Python的scikit-image模塊實(shí)例講解
在本篇文章里小編給大家整理了一篇關(guān)于Python的scikit-image模塊實(shí)例講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2020-12-12在django admin詳情表單顯示中添加自定義控件的實(shí)現(xiàn)
這篇文章主要介紹了在django admin詳情表單顯示中添加自定義控件的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Python 通過(guò)URL打開(kāi)圖片實(shí)例詳解
這篇文章主要介紹了Python 通過(guò)URL打開(kāi)圖片實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06