如何在Locust的worker实例中访问environment类上设置的自定义变量
问题根因
Locust 分布式运行时,master 节点仅会默认同步内置核心配置(如 host、总用户数、孵化速率等)给连接的 worker 节点,你自定义新增的 environment 变量不在默认同步列表中,因此 worker 节点上的 environment 实例不会自动拿到 variable1 的值,始终返回 None。
解决方法
方案1:利用Locust自定义消息机制同步变量(推荐)
- 首先在 master 节点的 test_start 事件监听器里,给所有连接的 worker 广播自定义变量:
from locust import events from locust.runners import MasterRunner @events.test_start.add_listener def on_test_start(environment, **kwargs): # 仅在master节点执行广播 if isinstance(environment.runner, MasterRunner): # 自定义消息类型,payload携带你要同步的变量 environment.runner.send_message( "sync_custom_vars", {"variable1": environment.variable1} )
- 然后在所有节点(master+worker都要注册)监听这个自定义消息,把收到的变量赋值到本地 environment:
@events.init.add_listener def on_locust_init(environment, **kwargs): # 注册自定义消息的处理函数 environment.runner.register_message( "sync_custom_vars", lambda msg, **kwargs: setattr(environment, "variable1", msg.data["variable1"]) )
- 之后你在 User 类的 on_start 方法里就可以正常取值了:
from locust import HttpUser, task class MyUser(HttpUser): def on_start(self): print(self.environment.variable1) # 此时worker节点也能正常拿到值 @task def test_task(self): self.client.get("/")
方案2:修改Locust内置参数同步逻辑(适配自定义分支场景)
你正在维护自定义的Locust分支,也可以直接修改master给worker发送启动测试请求的代码,把自定义变量加到同步参数里:
- 找到
runners.py中 MasterRunner 发送start消息的代码段,把你的variable1加到发送的 payload 中 - 再找到 worker 节点处理
start消息的代码段,把收到的variable1赋值到本地的 environment 实例即可
注意事项
- 如果你的自定义字段可能为空,要在表单提交和消息传递时做好默认值处理,避免赋值报错
- 如果有多个自定义变量,直接在消息 payload 里加多个键值对即可
内容的提问来源于stack exchange,提问作者Thomas Woeste
相关产品推荐
相关产品推荐

