You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Locust存在on_test_start时task方法无法获取全局变量更新值问题

根本原因

你启动了Locust的master-worker分布式运行模式,master进程和worker进程是完全独立的系统进程,各自会完整加载一次测试脚本,拥有独立的全局变量内存空间,互相不共享。

  • on_test_start事件仅会在master进程上触发,你修改的只是master进程内的user_var值,对worker进程无任何影响
  • 所有测试task均运行在worker进程上,worker进程的on_test_start不会触发,因此它的全局变量user_var始终保持初始值0,两个变量属于不同进程的内存空间,id自然不一致。

解决方案

方案1:取消分布式模式(单实例运行)

如果你的测试压力不需要用到分布式,直接修改启动逻辑,不要起master和worker,单进程运行Locust即可,此时全局变量属于同一个进程,修改后task可以正常读取到最新值:

# 替换原来的启动代码
if __name__=='__main__':
    import os
    from locust import main
    run_script = os.path.basename(__file__)
    main.main(["-f", run_script, "--host", base_url])

方案2:分布式场景下master广播变量给worker

如果必须使用分布式,可以通过Locust的自定义消息机制,把master修改后的变量值同步给所有worker:

# 新增worker端监听消息更新全局变量的逻辑
@events.init.add_listener
def on_init(environment, **kwargs):
    # 监听自定义的变量更新消息
    @environment.events.add_listener("update_user_var")
    def update_var(msg, **kwargs):
        global user_var
        user_var = msg["value"]

@events.test_start.add_listener
def on_test_start(environment,**kwargs):
    global  user_var
    user_var = 1
    print("method  var id:{}".format(id(user_var)))
    print("user_var:{}".format(user_var))
    # master节点广播更新消息给所有worker
    if hasattr(environment, "runner") and environment.runner.__class__.__name__ == "MasterRunner":
        environment.runner.send_message("update_user_var", {"value": user_var})

方案3:使用公共配置源

如果变量值是预先确定的,可以将值存在配置文件、环境变量等所有进程都能读取的公共位置,master和worker启动时直接从公共位置读取即可。

内容的提问来源于stack exchange,提问作者mozi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:48:01