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

YYQ發表於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')

相關文章