当前位置: 首页 > 工具软件 > GRequests > 使用案例 >

python3之grequests并发测试使用及与jmeter并发测试结果对比

阚原
2023-12-01

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')

 

 类似资料: