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
相关产品推荐
相关产品推荐

