grequests 執行併發測試與 jmeter 併發結果對比

楊亞琦發表於2020-11-13

log:

背景

之前一段時間做效能測試的時候,用過jmeter,使用python3寫過多執行緒/多程式指令碼,最後還使用了locust工具,但是最終的測試結果讓人有些迷茫,查詢了很多資料都說是locust比jmeter各種強大,但是在同樣單機的情況下,測試結果卻是jmeter給出的結果更直接。

分析

jmeter是基於執行緒進行併發,就是一個執行緒就是一個使用者
locust是基於協程,正常來說同樣的單機資源應該比jmeter更強,但是測試結果卻讓我有點迷(具體原理xxx,懵的)

測試

這兩天就抽時間研究了下協程,然後發現有個grequests庫可以進行並行執行,平常用的requests是序列執行的,如果說在併發的時候有可能出現阻塞情況(畢竟是一個執行完在執行下一個),grequests就不一樣,可以同時併發執行,上面說到的locust也在沒繼續測,深入瞭解過的朋友可以一起討論討論下這塊是為什麼。
1.寫了個測試用的介面,響應基本在十幾毫秒;

2.然後500併發,使用下面的指令碼和jmeter分別測試結果,發現grequests比jmeter併發的更優秀,具體結果大家可以自己親自測試體驗一下會更清楚。

絕對併發:在某個時間點同時觸發多個請求(品、細品)
相對併發:在某個時間段內,觸發了多個請求(在品,細品)

環境

python3

pip install grequests庫

說明:grequests是非同步非阻塞的非同步請求第三方包,使用了協程gevent,GRequests封裝了gevent的requests模組。

測試併發程式碼如下

# !/usr/bin/env python
# -*- encoding: utf-8 -*-
# @Author : yyq

import time
import grequests
from gevent.pool import Pool


def task():
qw = []
for we in range(500):
qw.append(grequests.get('http://172.19.0.239:5000/test/'))
print(we)
t1 = time.time()
print(t1)
list_req = grequests.map(qw)
print(time.time() - t1)
for i in list_req:
print(i.json(),i.status_code)


task()

測試的介面:

# !/usr/bin/env python
# -*- encoding: utf-8 -*-
# @Author : yyq

import time
from flask import Flask, jsonify

app = Flask(__name__)


@app.route('/test/')
def test():
print(time.ctime(), time.time())
time.sleep(1)
return jsonify({"success": "true"})


if __name__ == '__main__':
app.run(host='0.0.0.0')

相關文章