如何在Python开发中利用Locust进行Web接口高并发压测

轻涛吖_4956

轻涛吖_4956

2026-10-30

228人浏览

原创

Locust压测需显式启用--master/--worker分布式模式,单机默认单节点;wait_time、users、spawn_rate三者不匹配会导致RPS远低于预期;gevent monkey patch必须置于所有import之前。

如何在python开发中利用locust进行web接口高并发压测

Locust 压测不是“多开几个进程就并发上去了”,它依赖协程调度和主从角色分工,单机默认就是单节点;想突破几千并发,必须用 --master/--worker 显式分布式,且 wait_time、users、spawn_rate 三者不匹配时,RPS 会远低于预期。

Locust 分布式压测必须显式启用 --master/--worker 模式

很多人在本地开多个终端运行 locust -f locustfile.py,以为这就是分布式——其实不是。Locust 的分布式是明确的 C/S 架构:--master 节点只做调度和聚合,不发请求;--worker 节点才真正发压。不加参数永远只是单机模式。

常见失败现象:

  • Waiting for master to start:worker 启动后卡住,说明网络不通或 --master-host 写错(不能带 http://,只能是 IP 或主机名)
  • WebSocket 握手失败但日志无报错:master 和 worker 的 Locust 版本不一致(比如 master 是 2.31.0,worker 是 2.15.1)
  • Web UI 显示 users=0 且 RPS=0:master 启动时 locustfile.py 有语法错误,但错误提示可能被吞掉,只报 ImportError

正确启动方式:

# 在 master 主机上运行(监听 8089 和 5557 端口)
locust -f locustfile.py --master --host=http://api.example.com
<h1>在 worker 主机上运行(指定 master 地址,不带 http://)</h1><p>locust -f locustfile.py --worker --master-host=192.168.1.100</p>

wait_time、users、spawn_rate 共同决定真实 RPS

很多人设了 --users=1000 就以为能打出 1000 QPS,结果实际只有 200。根本原因是忽略了 wait_time 对单个用户请求频率的限制。

举例说明:

  • wait_time = between(1, 3) → 单个用户平均 2 秒发一次请求 → 1000 用户理论 RPS ≈ 500
  • --spawn-rate=10 表示每秒新增 10 个用户,拉满 1000 用户需 100 秒;若压测只跑 30 秒,实际并发远不到 1000
  • @task(10) 不是“执行 10 次”,而是相对权重:两个任务权重为 10 和 1,前者被选中的概率约是后者的 10 倍

调优建议:

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 先固定 wait_time = constant(0.1)(即 100ms 思考时间),观察单用户极限 RPS,再反推目标并发数
  • 压不出预期 RPS 时,优先检查 wait_time 是否过大,其次看 spawn_rate 是否太小导致拉不满 users
  • 避免把 wait_time 设为 constant(0),gevent 在极端高频下容易触发事件循环饥饿,反而降低吞吐

HttpUser.client 默认复用 session,但 token 等状态需手动维护

HttpUser.client 底层是 requests.Session,自动处理 Cookie,但像 JWT token、临时签名这类动态认证信息,必须由你显式存取和更新。

典型错误写法:

self.client.get("/data", headers={"Authorization": f"Bearer {self.token}"})
  • 在 @task 内部加 if not hasattr(self, "token"): 容错判断
  • 用 catch_response=True 包裹关键请求,失败时主动 response.failure("no token")
  • 避免在 on_start 中做重试逻辑,它只执行一次;高频 token 刷新应放在 task 内或用 events.request_failure 钩子捕获

gevent monkey patch 必须放在所有 import 之前

Locust 依赖 gevent 实现协程,而 gevent 要求对标准库进行 monkey patch 才能接管 IO。如果 patch 放错位置,会出现:

  • HTTP 请求阻塞主线程,CPU 占用低但并发上不去
  • 部分系统调用(如 time.sleep、socket)仍走原生线程,导致 greenlet 调度失效

正确顺序(必须是文件最顶部):

from gevent import monkey
monkey.patch_all()  # ⚠️ 这行必须在 import requests / locust 之前
<p>import requests
from locust import HttpUser, task, between</p>

如果你用了第三方库(如 redis-py、pymysql),也要确认它们是否支持 gevent;不支持的库会退化为同步阻塞,成为压测瓶颈点。

真正卡住 Locust 并发上限的,往往不是代码逻辑,而是没意识到 wait_time 是每个用户的节奏控制器,或是 monkey.patch_all() 被埋在一堆 import 下面——这些细节不处理,再多的 worker 也跑不满 CPU。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1831

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4924

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

29417

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3507

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3527

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2743

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习