Locust:用 Python 写压测脚本,能跑几十万并发

locust 在 GitHub 上已经拿到 27,916 Star 了。

这是一个开源的性能测试工具,专门用来对 HTTP 和其他协议做压力测试。跟 JMeter 那套 GUI 拖拽 + XML 配置的路线不一样,Locust 的思路是:用纯 Python 代码来定义测试场景。

正文顶部截图

1、这东西解决什么问题

做过压测的人都知道,传统工具的痛点在哪。

JMeter 功能是够用,但那个 GUI 配起来又慢又容易出错,脚本一复杂就变成一堆 XML 节点的堆砌。想写个循环、加个条件判断、做点数据计算,都得在 GUI 里点来点去。脚本没法版本管理,团队协作的时候谁改了什么根本看不清。

Locust 的做法很直接:把测试场景写成 Python 类。循环用 for,条件用 if,数据处理随便你写。测试脚本就是普通的 .py 文件,能放进 Git,能用 IDE 打断点调试。

from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
    wait_time = between(1, 2)

    def on_start(self):
        self.client.post("/login", json={"username":"foo", "password":"bar"})

    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

    @task(3)
    def view_item(self):
        for item_id in range(10):
            self.client.get(f"/item?id={item_id}", name="/item")

一个用户类,几个带 @task 装饰器的方法,权重用数字控制。想加登录流程就写 on_start,想循环请求就写 for 循环。没有额外的 DSL,没有配置文件,就是 Python。

2、怎么做到几十万并发的

Locust 底层用的是 gevent,一个基于协程的并发库。每个虚拟用户跑在一个 greenlet 里,开销很小。单机单进程就能撑住几千个并发用户,多台机器分布式跑的话,几十万并发也不难。

分布式的方式也很简单:一台机器当 master,其他机器当 worker。master 负责调度和汇总数据,worker 负责发请求。加机器就加 worker,不用改脚本。

命令行启动:

locust -f locustfile.py --host=https://example.com

README区域截图

3、Web UI 和实时数据

Locust 自带一个 Web 界面,默认跑在 8089 端口。打开浏览器就能配置并发数、启动压测、看实时数据。

界面上能看到的东西包括:每秒请求数(RPS)、响应时间分布、失败率、每个接口的详细统计。测试跑着的时候可以随时调整并发数,不用停了重来。

也可以不带 UI 跑,纯命令行模式适合塞进 CI/CD 流程里:

locust -f locustfile.py --headless --users 1000 --spawn-rate 10 --run-time 5m

4、不止是 HTTP

虽然 Locust 主要是用来测 Web 服务的,但它的架构是可扩展的。你可以自己写一个 Client 类,对接任何协议。官方文档里给了例子,社区也有人做了 gRPC、WebSocket、MQTT 等协议的插件。

这意味着不管是 REST API、数据库、消息队列还是自定义的 TCP 服务,都能用 Locust 来压。

5、跟其他工具的差别

跟 JMeter 比:Locust 的脚本更灵活,写起来更快,但图表展示没有 JMemter 那么多维度。如果你需要复杂的断言和响应提取,Locust 也能做,只是方式不同——直接在 Python 里写逻辑就行。

跟 k6 比:k6 用 JavaScript 写脚本,性能也不错。但 Locust 的优势在于 Python 生态,数据处理、文件读写、第三方库随便用。对 Python 开发者来说上手成本为零。

跟 Gatling 比:Gatling 基于 Scala,性能很好,但学习曲线陡。Locust 的门槛明显低一截。

6、适合什么场景

  • 后端服务上线前的容量评估
  • 接口性能回归测试,集成到 CI 里每次跑
  • 线上问题复现,模拟高并发场景定位瓶颈
  • 给客户出压测报告,用 Locust 的导出数据做分析

Locust 是 MIT 协议,可以商用,没有限制。Python 3.8 以上都能跑,pip install locust 一行搞定。

Locust 的导出数据做分析

Locust 是 MIT 协议,可以商用,没有限制。Python 3.8 以上都能跑,pip install locust 一行搞定。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐