Python grequests 执行并发测试与 jmeter 并发结果对比

YYQ · 2020年11月13日 · 最后由 an footman 回复于 2020年11月15日 · 2686 次阅读

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')
共收到 2 条回复 时间 点赞

# !/usr/bin/env python , 井号和叹号之间不应有空格

locust 和 grequests 都是用 requests + gevent ,利用猴子补丁执行异步发送请求。但是 locust 还支持 fasthttp,岂不是更好。一点个人拙见

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册