目前比較流行的python web框架:Flask、Tornado、Snaic、FastAPI、Quart、aiohttp
如下來自github上一個性能對比圖:
https://github.com/vibora-io/vibora
對於上圖的測試好像是請求hello world的測試,這種方式在實際應用明顯不可靠,所以我本地通過讀取mysql數據方式進行了測試。
環境准備
- 測試環境
python3.8
框架對應版本:
aiohttp 3.6.2
fastapi 0.55.1
Flask 1.1.2
Quart 0.12.0
sanic 20.3.0
tornado 6.0.4
- 測試工具Jmeter
- 測試數據 :mysql數據庫中comment表中插入了10000+條真實評論數據,后台運行時隨機取500條數據進行分詞,請求測試的時候用分好的詞語去查詢mysql(這樣保證了每次數據的隨機,及mysql查詢的隨機)
#!/usr/bin/python3
import pymysql
import jieba
import random
import json
db = pymysql.connect("xxxx","xx","xxx","xxx" )
keyword_set = set()
def init_keyword_set():
id_list = []
for i in range(500):
id_list.append(str(random.randint(0,10000)))
id_strs = ','.join(id_list)
cursor = db.cursor(pymysql.cursors.DictCursor)
# 使用 execute() 方法執行 SQL 查詢
cursor.execute("SELECT content from comment where id in (%s) and content is not null"%id_strs)
# 使用 fetchone() 方法獲取單條數據.
data = cursor.fetchall()
for item in data:
words = jieba.lcut(item['content'],cut_all=False)
keyword_set.update([x for x in words if len(x)>1])
print('len---------',len(keyword_set))
init_keyword_set()
def get_mysql():
# 使用 cursor() 方法創建一個游標對象 cursor
cursor = db.cursor(pymysql.cursors.DictCursor)
keyword = keyword_set.pop()
# 使用 execute() 方法執行 SQL 查詢
cursor.execute("SELECT id,content from comment where content like '%%%s%%' limit 10"%keyword)
# 使用 fetchone() 方法獲取單條數據.
data = cursor.fetchall()
# return data
return json.dumps(data)
if __name__ == '__main__':
get_mysql()
pass
# 關閉數據庫連接
# db.close()
測試
各個框架小調用get_mysql()查詢mysql
測試結果Jmeter導出
如下表格 分別對python的幾種框架進行了30QPS、200QPS、800QPS測試
表頭說明(響應時間的單位均為ms):
樣本:本次場景中一共完成了多少次請求
中位數:也就是說統計50%的用戶響應時間
90%百分位:90%用戶的響應時間
95%百分位:95%用戶的響應時間
troughput:吞吐量、“吐”進去的是請求,“吐”出來的是結果,吞吐率說的是軟件系統的“飯量”,即軟件系統的處理能力,也就是單位時間內軟件系統能夠處理多少數據/事務
結果分析:
對於結果我主要看99%百分位及異常百分比2個數據(我覺得99%百分位能說明框架對與絕大對數請求的響應時間,異常百分比能說明框架的穩定性)
圖中綠色表示最好 黃色次之。
- 單從測試來看各個框架其實並沒有量級上的差別(耗時主要發生在sql操作,實際web場景其實也是這樣),
- flask果然符合它輕量級的人設,在30QPS這種低並發的場景下表現得最優秀。
綜合來看aiohttp的性能最好。
PS Vibora運行失敗沒能測試:
Vibora官方說是需要python3.7+環境,但是我本地mac上3.7 3.8都有試過hello world都跑不起來 google了一大圈都沒有解決,最后放棄了
總結
本次測試可能有點片面,但是也能說明些問題,tornado老牌框架表現不錯,aiohttp這個后起之秀值得關注。
其實選擇一個框架不單單從性能方面考慮,我們還得從它的生態、廣泛度等方面考慮。