如何通过CLI自定义参数调整Locust的wait_time参数?
问题根源
你的代码出现问题是因为代码执行时序不匹配:
- 模块加载阶段,
MyUser类的定义代码(包括print(custom_wait_time)和wait_time = constant(custom_wait_time))会立即执行,此时events.init的监听函数还未触发,custom_wait_time还是初始的None。 events.init监听函数是在Locust解析完命令行参数、完成初始化后才运行的,这时候才会给custom_wait_time赋值,但MyUser类的wait_time已经提前用None初始化完成了。
解决方法
以下两种方案都能解决这个问题:
方案一:将wait_time定义为实例方法
让wait_time在每次调用时才去获取已赋值的custom_wait_time:
custom_wait_time = None @events.init_command_line_parser.add_listener def init_parser(parser): parser.add_argument("--locust-wait-time", type=int, include_in_web_ui=True, default=1, # 设置默认值避免无参数时出现None help="Wait time per each request of a user.") @events.init.add_listener def _(environment, **kwargs): global custom_wait_time custom_wait_time = environment.parsed_options.locust_wait_time print(custom_wait_time) class MyUser(HttpUser): def wait_time(self): return constant(custom_wait_time)()
方案二:在init事件中动态修改类属性
直接在events.init触发后,覆盖MyUser类的wait_time属性:
custom_wait_time = None @events.init_command_line_parser.add_listener def init_parser(parser): parser.add_argument("--locust-wait-time", type=int, include_in_web_ui=True, default=1, help="Wait time per each request of a user.") @events.init.add_listener def _(environment, **kwargs): global custom_wait_time custom_wait_time = environment.parsed_options.locust_wait_time print(custom_wait_time) # 动态覆盖类的wait_time属性 MyUser.wait_time = constant(custom_wait_time) class MyUser(HttpUser): # 先设置默认值,后续会被init事件中的代码覆盖 wait_time = constant(1)
内容的提问来源于stack exchange,提问作者bavo
相关产品推荐
相关产品推荐

