答案是Locust 1.0+版本中events模块路径变更导致的兼容性问题,需将原import events改为from locust import events,并更新TaskSet为HttpUser、适配钩子函数签名及第三方插件版本。

Locust安装后运行报错 ImportError: cannot import name 'events'
这是 Locust 1.0+ 版本升级后最常遇到的兼容性问题:旧版代码里直接导入 events,新版已将其移至 locust.events,且部分钩子函数签名也变了。
- 检查当前 Locust 版本:
locust --version,若 ≥1.0,请改用from locust import events - 旧写法
from locust.core import TaskSet已废弃,改用from locust import TaskSet(v1.x)或更推荐的HttpUser(v2.0+) - 如果项目依赖了第三方 Locust 插件(如
locust-plugins),确认其是否适配当前 Locust 版本,不匹配时会静默破坏事件注册
写一个能真实模拟用户行为的 HttpUser 类
单纯发 GET/POST 不等于压测 —— 真实流量有会话保持、参数动态生成、请求间隔、失败重试等特征,HttpUser 必须体现这些。
- 用
self.client.get("/api/v1/user", params={"id": self.user_id})比硬编码 URL 更可靠,self.user_id可在on_start()中随机生成或从文件读取 - 设置合理等待时间:
wait_time = between(1, 5)(单位秒),避免请求洪峰失真;若需固定节奏,用constant_pacing(2)(每2秒发起一次) - 务必捕获异常并标记失败:
with self.client.post("/api/v1/order", json=payload, catch_response=True) as resp:,再用if resp.status_code != 200: resp.failure("expected 200")
如何让压测结果反映接口真实瓶颈?
默认 Locust Web UI 只显示 RPS、响应时间中位数,但这些数字掩盖了长尾延迟、错误分布和资源争抢线索。
- 启用详细日志:
locust -f test.py --loglevel DEBUG,重点关注Response time distribution表格里的 95% 和 99% 分位值,而非平均值 - 添加自定义指标监控关键路径:
events.request_success.add_listener(lambda **kwargs: print(kwargs["name"])),或结合psutil在on_start()中采集本机 CPU/内存 - 不要只跑“单接口”,构造包含依赖链的场景:比如先
login获取 token,再用该 token 调/order,否则无法暴露鉴权服务或缓存穿透问题
分布式压测时 Worker 连不上 Master 的常见原因
locust --headless --master 和 locust --headless --worker --master-host=192.168.1.10 配合使用时,连不上往往不是配置写错,而是网络或版本隐性不一致。
立即学习“Python免费学习笔记(深入)”;
- 确保 Master 和 Worker 使用**完全相同的 Locust 版本**(
pip show locust对比),v2.15.1 和 v2.15.2 之间存在序列化协议变更,会导致 worker 启动后立即断连 - Master 默认监听
0.0.0.0:5557(控制)和5558(数据),检查防火墙是否放行这两个端口,尤其云服务器安全组 - Worker 启动后没输出
Connected to master日志?加--loglevel INFO查看底层连接尝试,常见是 DNS 解析失败(比如用了主机名但未配置 /etc/hosts)
py-spy record -o profile.svg --pid $PID 抓 Python 进程热点。这点容易被忽略——压测工具只是触发器,不是诊断器。


















