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