python 寫(xiě)一個(gè)性能測(cè)試工具(一)
國(guó)慶重新學(xué)習(xí)了一下go的gin高性能測(cè)試框架。
用JMeter來(lái)測(cè)試gin與flask接口的性能,差別很大。
為什么我自己不嘗試寫(xiě)一個(gè)性能工具,性能工具的核心就是 并發(fā) 和 請(qǐng)求。
請(qǐng)求可以選擇Python的requests庫(kù)。
并發(fā)可以通過(guò)python的 進(jìn)程、線(xiàn)程、協(xié)程模擬。
這么一想,也不是很難了,上手?jǐn)]一個(gè)。
依賴(lài)庫(kù)
requests==2.22.0 gevent==20.9.0 numpy==1.19.2
requests 大家并不陌生,HTTP請(qǐng)求庫(kù)。
gevent是python協(xié)程庫(kù),通過(guò)協(xié)程模擬并發(fā)更節(jié)省資源,在同樣配置下能模擬更多的并發(fā)。
numpy 是python的數(shù)據(jù)計(jì)算庫(kù),提供大量組數(shù)和矩陣運(yùn)算,這里用它求列表的平均值。
實(shí)現(xiàn)腳本
好了,接下來(lái)開(kāi)始上手寫(xiě)代碼了。
from __future__ import print_function import time import gevent from gevent import monkey monkey.patch_all() import requests from numpy import mean users = 10 # 用戶(hù)數(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("用戶(hù)數(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)建線(xiàn)程組有兩個(gè)參數(shù) 線(xiàn)程數(shù)和 循環(huán)數(shù),即 用戶(hù)數(shù) 和請(qǐng)求數(shù),設(shè)置多少個(gè)用戶(hù),每個(gè)用戶(hù)用戶(hù)跑多少次,用戶(hù)數(shù)通過(guò)協(xié)程模擬,每次用戶(hù)運(yùn)行次數(shù)通過(guò)for循環(huán)實(shí)現(xiàn)。
至于請(qǐng)求就比較簡(jiǎn)單了,直接通過(guò)requests發(fā)送請(qǐng)求。通過(guò)判斷影響的狀態(tài)碼是否為200來(lái)判斷是否成功,通過(guò)分別計(jì)算成功和失敗的請(qǐng)求個(gè)數(shù)。
關(guān)于請(qǐng)求時(shí)間統(tǒng)計(jì),在每次請(qǐng)求前后獲得當(dāng)前時(shí)間戳,然后計(jì)算時(shí)間差就是單個(gè)接口的調(diào)用時(shí)間。最大,最小,平均通過(guò)計(jì)算就可輕松的得到。
> python3 ab.py 請(qǐng)求URL: http://127.0.0.1:8080/user/tom 用戶(hù)數(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)求類(lèi)型(get/post/put/delete)和參數(shù)。
更多統(tǒng)計(jì)維度,吞吐量、吞吐率
增加啟動(dòng)時(shí)間,思考時(shí)間等
...
以上就是python 寫(xiě)一個(gè)性能測(cè)試工具(一)的詳細(xì)內(nèi)容,更多關(guān)于python 性能測(cè)試工具的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python?NumPy科學(xué)計(jì)算庫(kù)的高級(jí)應(yīng)用
這篇文章主要為大家介紹了Python?NumPy科學(xué)計(jì)算庫(kù)的高級(jí)應(yīng)用深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Python腳本實(shí)現(xiàn)網(wǎng)卡流量監(jiān)控
這篇文章主要介紹了Python腳本實(shí)現(xiàn)網(wǎng)卡流量監(jiān)控,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-02-02python之語(yǔ)句mode = 'test' if y&nb
這篇文章主要介紹了python之語(yǔ)句mode = 'test' if y is None else 'train'問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Python運(yùn)維自動(dòng)化psutil模塊的監(jiān)控和管理深入探究
這篇文章主要為大家介紹了Python運(yùn)維自動(dòng)化psutil模塊的監(jiān)控和管理深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python3實(shí)現(xiàn)將文件樹(shù)中所有文件和子目錄歸檔到tar壓縮文件的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)將文件樹(shù)中所有文件和子目錄歸檔到tar壓縮文件的方法,涉及Python3使用tarfile模塊實(shí)現(xiàn)tar壓縮文件的技巧,需要的朋友可以參考下2015-05-05在python win系統(tǒng)下 打開(kāi)TXT文件的實(shí)例
下面小編就為大家分享一篇在python win系統(tǒng)下 打開(kāi)TXT文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Python入門(mén)教程5. 字典基本操作【定義、運(yùn)算、常用函數(shù)】
這篇文章主要介紹了Python字典基本操作,包括字典的基本定義、運(yùn)算與常用函數(shù)相關(guān)使用技巧,代碼注釋中備有詳盡說(shuō)明,便于理解,需要的朋友可以參考下2018-11-11Python實(shí)現(xiàn)簡(jiǎn)單的列表冒泡排序和反轉(zhuǎn)列表操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)單的列表冒泡排序和反轉(zhuǎn)列表操作,涉及Python列表遍歷、排序、追加等相關(guān)操作技巧,需要的朋友可以參考下2019-07-07