日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FastAPI使用async?乱用async导致灾难,不如直接不用

發布時間:2025/3/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FastAPI使用async?乱用async导致灾难,不如直接不用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

警告:亂用async導致災難

背景

研發過程中,測試同事反饋,調用XX接口的時候其他的接口全部沒法調用了,都被阻塞住了。

我當時認為,機器太挫了,有其他任務在機器上運行,請求無法處理。但,很快我就被打臉。

這里用一個DEMO來展示,只包含了三個文件

第一個文件 ?fastApiServer,這個文件里面定義了兩個API,并啟動了服務器

import xmlrpc.client import uvicorn from datetime import datetime from fastapi import FastAPIapp = FastAPI()@app.get("/root1") async def root1():print("1111", datetime.now())# 調用RPCurl = 'http://{}:{}'.format("127.0.0.1", 1081)client = xmlrpc.client.ServerProxy(url)res = client.test1()if res is not None:print(res)# 調用RPC結束print("2222", datetime.now())return {"message": "Hello World"}@app.get("/root2") async def root2():print("3333", datetime.now())# 調用RPCurl = 'http://{}:{}'.format("127.0.0.1", 1081)client = xmlrpc.client.ServerProxy(url)res = client.test2()if res is not None:print(res)# 調用RPC結束print("4444", datetime.now())return {"message": "Hello World"}uvicorn.run(app=app, host="0.0.0.0", port=1080, timeout_keep_alive=1200)

第二個文件rpcServer.py

import time from socketserver import ThreadingMixIn from xmlrpc.server import SimpleXMLRPCServerclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):name = "xml-server"def test1():print("test1()")time.sleep(10)status = "1"return statusdef test2():print("test2()")status = "2"return statusserver = ThreadXMLRPCServer(('0.0.0.0', 1081)) server.register_function(test1, "test1") server.register_function(test2, "test2") server.serve_forever()

第三個文件 test.py 測試文件,先后發送兩個請求

import time from threading import Threadimport requestsdef k1():requests.get(url="http://127.0.0.1:1080/root1")def k2():requests.get(url="http://127.0.0.1:1080/root2")Thread(target=k1).start() time.sleep(1) Thread(target=k2).start()

啟動服務


跑測試

?

我震驚發現,兩個先后間隔1秒到達的請求,竟然需要等待第一個請求結束之后,才會去處理第二個請求

問題原因

如果你定義了async函數,函數體卻是同步的調用,將導致函數執行過程變成串行。

解決方案

方法一 直接刪除async

import xmlrpc.client import uvicorn from datetime import datetime from fastapi import FastAPIapp = FastAPI()@app.get("/root1") def root1():print("1111", datetime.now())# 調用RPCurl = 'http://{}:{}'.format("127.0.0.1", 1081)client = xmlrpc.client.ServerProxy(url)res = client.test1()if res is not None:print(res)# 調用RPC結束print("2222", datetime.now())return {"message": "Hello World"}@app.get("/root2") def root2():print("3333", datetime.now())# 調用RPCurl = 'http://{}:{}'.format("127.0.0.1", 1081)client = xmlrpc.client.ServerProxy(url)res = client.test2()if res is not None:print(res)# 調用RPC結束print("4444", datetime.now())return {"message": "Hello World"}uvicorn.run(app=app, host="0.0.0.0", port=1080, timeout_keep_alive=1200)

修改后,再次運行測試腳本

結果和預期一致。

結論

在不了解所調用函數是否支持await的情況下,不使用async,使用普通函數即可

參考鏈接

https://blog.csdn.net/qq_29518275/article/details/109360617

https://fastapi.tiangolo.com/async/

總結

以上是生活随笔為你收集整理的FastAPI使用async?乱用async导致灾难,不如直接不用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。