Python flask與fastapi性能測(cè)試方法介紹
背景
sy項(xiàng)目通過(guò)MQ接受業(yè)務(wù)系統(tǒng)的業(yè)務(wù)數(shù)據(jù),通過(guò)運(yùn)行開(kāi)發(fā)者開(kāi)發(fā)的python腳本執(zhí)行業(yè)務(wù)系統(tǒng)與財(cái)務(wù)系統(tǒng)數(shù)據(jù)的一致性校驗(yàn)。
sy系統(tǒng)需要每天運(yùn)行大量的python腳本。目前使用falsk日運(yùn)行6W+次python腳本,由于性能存在瓶頸,需要引入
新的fastapi框架,來(lái)解決cpu、內(nèi)存性能壓榨不夠及目前的性能瓶頸。本文目標(biāo)給出兩者的性能測(cè)試報(bào)告。
給出選擇哪個(gè)框架的性能數(shù)據(jù)支撐。
apache ab介紹
apache ab性能測(cè)試
安裝
yum -y install httpd-tools
部分參數(shù)說(shuō)明
-n 執(zhí)行的請(qǐng)求總數(shù)
-c 并發(fā)數(shù), 同時(shí)執(zhí)行的數(shù)量, c不能大于n
-p post請(qǐng)求指定的文件
-T header Content-type值,默認(rèn)為 'text/plain'
測(cè)試get請(qǐng)求
ab -c 10 http://127.0.0.1:8081/cppla
測(cè)試post請(qǐng)求
ab -n 100 -c 10 -T 'application/json' -p httpjson.txt http://127.0.0.1:8081/cppla1
// httpjson.txt的內(nèi)容
{"recordId": 123}
測(cè)試計(jì)劃
模擬真實(shí)每次請(qǐng)求調(diào)用腳本,分別對(duì)每一個(gè)數(shù)量級(jí)的請(qǐng)求量進(jìn)行測(cè)試。
| 請(qǐng)求總數(shù) | 每次并發(fā)數(shù) | 每次并發(fā)數(shù) | 每次并發(fā)數(shù) |
|---|---|---|---|
| 100 | 10 | 100 | 1000 |
| 1000 | 10 | 100 | 1000 |
| 10000 | 10 | 100 | 1000 |
| 20000 | 10 | 100 | 1000 |
| 30000 | 10 | 100 | 1000 |
| 40000 | 10 | 100 | 1000 |
| 50000 | 10 | 100 | 1000 |
| 60000 | 10 | 100 | 1000 |
| 80000 | 10 | 100 | 1000 |
測(cè)試代碼
處理post請(qǐng)求,延時(shí)3s返回結(jié)果。flask啟動(dòng)20個(gè)進(jìn)程。fastapi啟動(dòng)一個(gè)進(jìn)程。
## flask 代碼
# coding: utf-8
from gevent import monkey
from gevent.pywsgi import WSGIServer
import requests
import datetime
import os
from multiprocessing import cpu_count, Process
from flask import Flask, jsonify,request
import json
import traceback
import importlib
from loguru import logger
import time
app = Flask(__name__)
# 執(zhí)行run方法
@app.route("/cppla1", methods=['POST', 'GET'])
def cppla1():
data = request.json
time.sleep(3)
return data
# 啟動(dòng)監(jiān)聽(tīng)ip、端口
def run(MULTI_PROCESS):
if MULTI_PROCESS == False:
WSGIServer(('0.0.0.0', 8081), app).serve_forever()
else:
mulserver = WSGIServer(('0.0.0.0', 8081), app)
mulserver.start()
def server_forever():
mulserver.start_accepting()
mulserver._stop_event.wait()
# for i in range(cpu_count()):
for i in range(20):
logger.info('啟動(dòng)進(jìn)程第幾個(gè):{}', i)
p = Process(target=server_forever)
p.start()
if __name__ == "__main__":
# 單進(jìn)程 + 協(xié)程
# run(False)
# 多進(jìn)程 + 協(xié)程
log_init()
run(True)## fastapi
# coding: utf-8
# import web framework
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
# import base lib
import datetime
import os
import requests
import json
import traceback
import importlib
from loguru import logger
import time
app = FastAPI()
@app.post("/cppla1")
def function_benchmark(data:dict):
time.sleep(3)
return {"item": data}
# 啟動(dòng)監(jiān)聽(tīng)ip、端口
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8081)測(cè)試結(jié)果
| 框架類型 | 請(qǐng)求總數(shù) | 每次并發(fā)數(shù) | 耗時(shí)(s) | 每次并發(fā)數(shù) | 耗時(shí)(s) | 每次并發(fā)數(shù) | 耗時(shí)(s) |
|---|---|---|---|---|---|---|---|
| fastapi | 100 | 10 | 33.119 | 100 | 12.148 | 1000 | ab命令不支持 |
| flask | 100 | 10 | 45.088 | 100 | 81.106 | 1000 | ab命令不支持 |
| fastapi | 1000 | 10 | 304.057 | 100 | 78.283 | 1000 | 78.631 |
| flask | 1000 | 10 | 327.472 | 100 | 198.273 | 1000 | 303.442 |
| fastapi | 10000 | 10 | x | 100 | 754.296 | 1000 | 757.719 |
| flask | 10000 | 10 | x | 100 | 1550.119 | 1000 | 1970.427 |
| fastapi | 20000 | 10 | x | 100 | x | 1000 | x |
| flask | 20000 | 10 | x | 100 | x | 1000 | x |
| fastapi | 30000 | 10 | x | 100 | x | 1000 | x |
| flask | 30000 | 10 | x | 100 | x | 1000 | x |
| fastapi | 40000 | 10 | x | 100 | x | 1000 | x |
| flask | 40000 | 10 | x | 100 | x | 1000 | x |
| fastapi | 50000 | 10 | x | 100 | x | 1000 | x |
| flask | 50000 | 10 | x | 100 | x | 1000 | x |
| fastapi | 60000 | 10 | x | 100 | x | 1000 | x |
| flask | 60000 | 10 | x | 100 | x | 1000 | x |
| fastapi | 80000 | 10 | x | 100 | x | 1000 | x |
| flask | 80000 | 10 | x | 100 | x | 1000 | x |
結(jié)論
fastapi是flask性能的3倍,推薦使用fastap。
到此這篇關(guān)于Python flask與fastapi性能測(cè)試方法介紹的文章就介紹到這了,更多相關(guān)flask與fastapi性能測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch無(wú)法使用GPU問(wèn)題的解決方法
這篇文章主要介紹了如何解決pytorch 無(wú)法使用GPU 的問(wèn)題,文中通過(guò)代碼和圖文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02
在Python中操作字典之setdefault()方法的使用
這篇文章主要介紹了在Python中操作字典之setdefault()方法的使用,是Python入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05
使用Playwright進(jìn)行視覺(jué)回歸測(cè)試詳解
這篇文章主要介紹了使用Playwright進(jìn)行視覺(jué)回歸測(cè)試詳解,視覺(jué)回歸測(cè)試是一種軟件測(cè)試技術(shù),專注于檢測(cè)Web應(yīng)用程序或網(wǎng)站的用戶界面中的視覺(jué)變化和差異,需要的朋友可以參考下2023-08-08
Python+OpenCV圖像處理之直方圖統(tǒng)計(jì)
直方圖就是對(duì)圖像的另外一種解釋,它描述了整幅圖像的灰度分布。通過(guò)直方圖我們可以對(duì)圖像的亮度、灰度分布、對(duì)比度等有了一個(gè)直觀的認(rèn)識(shí)。本文將為大家詳細(xì)介紹一下如何通過(guò)OpenCV實(shí)現(xiàn)直方圖統(tǒng)計(jì),感興趣的可以了解一下2021-12-12
Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程
這篇文章主要介紹了Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

