網(wǎng)站首頁 編程語言 正文
背景
sy項(xiàng)目通過MQ接受業(yè)務(wù)系統(tǒng)的業(yè)務(wù)數(shù)據(jù),通過運(yùn)行開發(fā)者開發(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框架,來解決cpu、內(nèi)存性能壓榨不夠及目前的性能瓶頸。本文目標(biāo)給出兩者的性能測(cè)試報(bào)告。
給出選擇哪個(gè)框架的性能數(shù)據(jù)支撐。
apache ab介紹
apache ab性能測(cè)試
安裝
? ? yum -y install httpd-tools
部分參數(shù)說明
-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)聽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)聽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。
原文鏈接:https://blog.csdn.net/u013565163/article/details/128048213
相關(guān)推薦
- 2022-11-04 詳解Pytorch中的tensor數(shù)據(jù)結(jié)構(gòu)_python
- 2022-07-02 SpringBoot-?@SessionAttributes--使用/實(shí)例
- 2022-06-18 asp.net中Log4.net的工具類helper_實(shí)用技巧
- 2022-12-21 Python中的取整、取余運(yùn)算方法_python
- 2022-07-29 解決Vmware虛擬機(jī)安裝centos8報(bào)錯(cuò)“Section?%Packages?Does?Not?
- 2022-07-08 Python實(shí)現(xiàn)超快窗口截圖功能詳解_python
- 2022-11-28 C語言中g(shù)etchar()函數(shù)的用法小結(jié)_C 語言
- 2022-08-19 python查看自己安裝的所有庫(kù)并導(dǎo)出的命令_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支