Python项目的性能压测是通过模拟大量用户并发访问,检测系统在不同负载下的响应速度、吞吐量、资源占用等指标,从而判断系统是否满足业务需求、是否存在性能瓶颈的过程。合理的压测能够帮助开发者提前发现代码逻辑、数据库查询、接口设计等方面的问题,避免上线后出现服务不可用的情况。

常用Python项目压测方法
1. 使用Locust进行分布式压测
Locust是Python生态中常用的压测工具,支持用Python代码编写压测场景,能够模拟大量用户并发请求,还支持分布式部署提升压测并发量。使用时只需要定义用户行为类,指定请求接口和请求参数即可。
下面是一个简单的Locust压测脚本示例,模拟用户访问一个查询接口:
from locust import HttpUser, task, between
class TestUser(HttpUser):
# 每个用户请求之间的等待时间,1到3秒随机
wait_time = between(1, 3)
@task(1)
def query_data(self):
# 模拟访问数据查询接口
self.client.get("/api/query?page=1&size=10")
@task(2)
def submit_data(self):
# 模拟提交数据接口,携带json参数
payload = {"name": "test", "age": 20}
self.client.post("/api/submit", json=payload)
运行脚本后,访问Locust自带的Web控制台,就可以设置并发用户数、每秒新增用户数等参数,实时查看压测的QPS、响应时间、错误率等指标。
2. 使用ab工具配合Python脚本
ab是Apache自带的压测工具,虽然本身不是Python编写,但可以和Python项目配合使用。适合快速测试单个接口的极限性能,不需要编写复杂的压测逻辑。使用时只需要指定请求地址、并发数、总请求数即可。
示例命令如下,模拟100个并发用户,总共发送1000个请求到本地Python服务的接口:
ab -n 1000 -c 100 http://127.0.0.1:8000/api/test
压测完成后ab会输出详细的报告,包括平均响应时间、90%请求的响应时间、每秒处理的请求数等信息。
3. 基于unittest编写自定义压测逻辑
如果项目有特殊压测需求,比如需要模拟复杂的业务流程、动态生成请求参数,可以基于Python的unittest框架编写自定义压测脚本,结合多线程或者协程实现并发请求。
下面是使用多线程实现简单压测的示例:
import threading
import requests
import time
def send_request():
# 发送单个请求
start = time.time()
try:
res = requests.get("http://127.0.0.1:8000/api/test")
cost = time.time() - start
print(f"请求状态:{res.status_code},耗时:{cost:.2f}秒")
except Exception as e:
print(f"请求失败:{e}")
if __name__ == "__main__":
# 创建50个线程模拟并发
thread_list = []
for i in range(50):
t = threading.Thread(target=send_request)
thread_list.append(t)
t.start()
# 等待所有线程执行完成
for t in thread_list:
t.join()
压测结果分析要点
完成压测后,需要重点关注以下几个指标:
- 响应时间:包括平均响应时间、90%响应时间、99%响应时间,判断大部分用户的请求是否能在可接受时间内完成
- 吞吐量:每秒处理的请求数(QPS),判断系统的最大承载能力
- 错误率:请求失败的比例,错误率过高说明系统存在稳定性问题
- 资源占用:压测过程中CPU、内存、网络的使用情况,判断是否存在资源瓶颈
压测注意事项
进行Python项目压测时,需要注意以下几点:
- 压测环境尽量和生产环境配置一致,避免使用低配测试环境得到不符合实际的压测结果
- 压测时逐步增加并发量,不要一开始就使用最大并发,避免直接压垮服务
- 压测过程中不要只关注接口返回,还要观察服务日志,排查是否有报错、超时等问题
- 压测完成后及时停止压测脚本,避免持续占用资源影响其他服务
性能压测不是一次性的工作,建议在每次版本迭代后都进行常规压测,及时发现新代码带来的性能问题。