Python?FastApi結合異步執(zhí)行方式
Python FastApi結合異步執(zhí)行
需求說明
在使用fastApi框架的時候,往往程序會卡到uvicorn.run方法的執(zhí)行步驟,從而其下面同步執(zhí)行的動作不能被執(zhí)行,此時需要使用異步思維進行其他動作的執(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中實現異步問題
在FastAPI應用中使用異步特性可以提高并發(fā)性能,但如果您要調用的模型是同步的,可能會導致阻塞。
為了實現異步處理,您可以將阻塞的操作委托給線程池或進程池,以便異步執(zhí)行。
以下是一種基本方法來實現異步處理圖片識別任務:
from fastapi import FastAPI
from concurrent.futures import ThreadPoolExecutor
import asyncio
app = FastAPI()
executor = ThreadPoolExecutor(max_workers=10) # 創(chuàng)建線程池,可以根據需求調整線程數
# 模擬一個阻塞的圖片識別函數
def blocking_image_recognition(image_data):
# 模擬耗時操作,實際中會調用模型進行識別
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)
# 此處可以將結果保存到數據庫或進行其他操作
# 使用異步方式進行數據庫操作
# ...
return {"result": result}在上述示例中,我們使用ThreadPoolExecutor創(chuàng)建了一個線程池,用于異步執(zhí)行阻塞操作。blocking_image_recognition函數模擬了一個耗時的識別操作,實際中會根據模型來實現。在recognize_image路由中,我們使用loop.run_in_executor將阻塞操作交給線程池來異步執(zhí)行。
在處理識別結果時,您可以使用異步框架(例如Tortoise-ORM)來保存數據到數據庫,確保數據庫操作也是非阻塞的。這樣,您就可以同時處理多個圖片識別任務,提高并發(fā)性能。
如果需要更高級的并發(fā)控制,您還可以考慮使用異步任務隊列(例如Celery)來進一步分布式處理圖片識別任務。 Celery允許您在多個遠程機器上并行執(zhí)行任務。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
在django admin詳情表單顯示中添加自定義控件的實現
這篇文章主要介紹了在django admin詳情表單顯示中添加自定義控件的實現,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03

