Locust作为库使用时如何通过编程实现分布式运行模式
Locust作为库引入的分布式模式改造方案
你现有的User类不需要任何修改,仅需调整主逻辑中Runner的创建规则,区分主节点、工作节点的启动逻辑即可。
核心依赖导入
你需要额外导入Locust的分布式Runner类:
from locust.runners import MasterRunner, WorkerRunner
完整改造后代码
from locust import HttpUser, task from locust.env import Environment from locust.runners import MasterRunner, WorkerRunner from locust.stats import stats_printer, stats_history, StatsCSVFileWriter import gevent # 原User类逻辑完全保持不变 # host, port and reqs are external parameters class User(HttpUser): host = f"{host}/{port}" @task def task1(self): for req in reqs: self.client.request(req['method'],req['path'],name=f"{port}",headers=req['headers'],data=req['body']) def on_start(self): self.client.verify = False # 可通过命令行参数、环境变量控制节点角色,这里用变量示例 is_master = False # 主节点启动时改为True master_host = "你的主节点实际IP" master_port = 5557 # Locust默认通信端口,无特殊需求无需修改 env = Environment(user_classes=[User]) if is_master: # 主节点创建MasterRunner,监听指定端口等待工作节点接入 env.create_master_runner(master_bind_host="0.0.0.0", master_bind_port=master_port) # 统计打印、CSV导出、压测启停逻辑全部保留在主节点侧 gevent.spawn(stats_printer(env.stats)) gevent.spawn(stats_history, env.runner) csvWriter = StatsCSVFileWriter( environment=env, base_filepath=f"{CWD}/outputs/{port}", full_history=True, percentiles_to_report=[0.5,0.6,0.7,0.8,0.9, 0.95, 0.99] ) gevent.spawn(csvWriter) # 总并发数、生成速率在主节点配置,会自动分配到所有工作节点 env.runner.start(100, spawn_rate=5) gevent.spawn_later(30,lambda: saveReportAndQuit(env,port)) else: # 工作节点创建WorkerRunner,主动连接主节点 env.create_worker_runner(master_host=master_host, master_port=master_port) # 主/工作节点都需要等待运行结束 env.runner.greenlet.join()
运行说明
- 先启动主节点:将
is_master设为True,运行代码,主节点会启动监听等待工作节点接入 - 再启动所有工作节点:将
is_master设为False,填写正确的主节点IP,在所有工作服务器上运行代码,节点会自动连接主节点 - 所有工作节点的代码、依赖的外部参数(host、port、reqs等)必须和主节点完全一致,避免任务逻辑异常
注意事项
- 确保主节点的5557、5558端口防火墙对所有工作节点开放,Locust分布式模式需要这两个端口完成通信
- 你使用的2.4.0版本完全支持上述API,无需升级版本
内容的提问来源于stack exchange,提问作者LonelyDaoist
相关产品推荐
相关产品推荐

