python 寫一個(gè)性能測(cè)試工具(一)
國(guó)慶重新學(xué)習(xí)了一下go的gin高性能測(cè)試框架。
用JMeter來測(cè)試gin與flask接口的性能,差別很大。
為什么我自己不嘗試寫一個(gè)性能工具,性能工具的核心就是 并發(fā) 和 請(qǐng)求。
請(qǐng)求可以選擇Python的requests庫(kù)。
并發(fā)可以通過python的 進(jìn)程、線程、協(xié)程模擬。
這么一想,也不是很難了,上手?jǐn)]一個(gè)。
依賴庫(kù)
requests==2.22.0 gevent==20.9.0 numpy==1.19.2
requests 大家并不陌生,HTTP請(qǐng)求庫(kù)。
gevent是python協(xié)程庫(kù),通過協(xié)程模擬并發(fā)更節(jié)省資源,在同樣配置下能模擬更多的并發(fā)。
numpy 是python的數(shù)據(jù)計(jì)算庫(kù),提供大量組數(shù)和矩陣運(yùn)算,這里用它求列表的平均值。
實(shí)現(xiàn)腳本
好了,接下來開始上手寫代碼了。
from __future__ import print_function
import time
import gevent
from gevent import monkey
monkey.patch_all()
import requests
from numpy import mean
users = 10 # 用戶數(shù)
numbers = 100 # 請(qǐng)求次數(shù)
req_url = "http://127.0.0.1:8080/user/tom" # 請(qǐng)求URL
print("請(qǐng)求URL: {url}".format(url=req_url))
print("用戶數(shù):{},循環(huán)次數(shù): {}".format(users, numbers))
print("============== Running ===================")
pass_number = 0
fail_number = 0
run_time_list = []
def running(url):
global fail_number
global pass_number
for _ in range(numbers):
start_time = time.time()
r = requests.get(url)
if r.status_code == 200:
pass_number = pass_number + 1
print(".", end="")
else:
fail_number = fail_number + 1
print("F", end="")
end_time = time.time()
run_time = round(end_time - start_time, 4)
run_time_list.append(run_time)
jobs = [gevent.spawn(running, req_url) for _url in range(users)]
gevent.wait(jobs)
print("\n============== Results ===================")
print("最大: {} s".format(str(max(run_time_list))))
print("最小: {} s".format(str(min(run_time_list))))
print("平均: {} s".format(str(round(mean(run_time_list), 4))))
print("請(qǐng)求成功", pass_number)
print("請(qǐng)求失敗", fail_number)
print("============== end ===================")
設(shè)計(jì)思路
在JMeter中創(chuàng)建線程組有兩個(gè)參數(shù) 線程數(shù)和 循環(huán)數(shù),即 用戶數(shù) 和請(qǐng)求數(shù),設(shè)置多少個(gè)用戶,每個(gè)用戶用戶跑多少次,用戶數(shù)通過協(xié)程模擬,每次用戶運(yùn)行次數(shù)通過for循環(huán)實(shí)現(xiàn)。
至于請(qǐng)求就比較簡(jiǎn)單了,直接通過requests發(fā)送請(qǐng)求。通過判斷影響的狀態(tài)碼是否為200來判斷是否成功,通過分別計(jì)算成功和失敗的請(qǐng)求個(gè)數(shù)。
關(guān)于請(qǐng)求時(shí)間統(tǒng)計(jì),在每次請(qǐng)求前后獲得當(dāng)前時(shí)間戳,然后計(jì)算時(shí)間差就是單個(gè)接口的調(diào)用時(shí)間。最大,最小,平均通過計(jì)算就可輕松的得到。
> python3 ab.py 請(qǐng)求URL: http://127.0.0.1:8080/user/tom 用戶數(shù):10,循環(huán)次數(shù): 100 ============== Running =================== ............................................................................................................... ............................................................................................................... ............................................................................................................... ............................................................................................................... ............................................................................................................... ............................................................................................................... ............................................................................................................... ............................................................................................................... ............................................................................................................... . ============== Results =================== 最大: 0.0352 s 最小: 0.0036 s 平均: 0.0204 s 請(qǐng)求成功 1000 請(qǐng)求失敗 0 ============== end ===================
后續(xù)
把a(bǔ)b.py腳本做成 ab 命令行工具。
支持更多的請(qǐng)求類型(get/post/put/delete)和參數(shù)。
更多統(tǒng)計(jì)維度,吞吐量、吞吐率
增加啟動(dòng)時(shí)間,思考時(shí)間等
...
以上就是python 寫一個(gè)性能測(cè)試工具(一)的詳細(xì)內(nèi)容,更多關(guān)于python 性能測(cè)試工具的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python中類似于jquery的pyquery庫(kù)用法分析
這篇文章主要介紹了Python中類似于jquery的pyquery庫(kù)用法,結(jié)合實(shí)例形式分析了pyquery庫(kù)的概念、原理、使用方法及操作技巧,需要的朋友可以參考下2019-12-12
Python Socket庫(kù)基礎(chǔ)方法與應(yīng)用詳解
這篇文章主要介紹了關(guān)于Python socket庫(kù)的詳細(xì)技術(shù)解析,包含基礎(chǔ)方法說明、工作原理剖析,以及多個(gè)應(yīng)用領(lǐng)域的完整實(shí)現(xiàn)代碼,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2025-04-04
Python正則表達(dá)式高效處理文本數(shù)據(jù)的秘訣輕松掌握
當(dāng)談到文本處理和搜索時(shí),正則表達(dá)式是Python中一個(gè)強(qiáng)大且不可或缺的工具,正則表達(dá)式是一種用于搜索、匹配和處理文本的模式描述語(yǔ)言,可以在大量文本數(shù)據(jù)中快速而靈活地查找、識(shí)別和提取所需的信息,2023-11-11
Python數(shù)據(jù)可視化 pyecharts實(shí)現(xiàn)各種統(tǒng)計(jì)圖表過程詳解
這篇文章主要介紹了Python數(shù)據(jù)可視化 pyecharts實(shí)現(xiàn)各種統(tǒng)計(jì)圖表過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
利用Python和C語(yǔ)言分別實(shí)現(xiàn)哈夫曼編碼
這篇文章主要為大家詳細(xì)介紹了如何利用Python和C語(yǔ)言分別實(shí)現(xiàn)哈夫曼編碼,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-07-07
python實(shí)現(xiàn)引用其他路徑包里面的模塊
這篇文章主要介紹了python實(shí)現(xiàn)引用其他路徑包里面的模塊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
使用Python實(shí)現(xiàn)密碼與驗(yàn)證碼的MD5加密
在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)加密是一個(gè)非常重要的環(huán)節(jié),無論是用戶密碼、驗(yàn)證碼,還是其他敏感信息,加密都是保護(hù)數(shù)據(jù)安全的關(guān)鍵手段之一,本文將通過一個(gè)具體的例子,詳細(xì)講解如何使用 Python 實(shí)現(xiàn)密碼與驗(yàn)證碼的 MD5 加密2025-02-02

