能否在LoadShape中修改User的fixed_count?含分布式与重平衡疑问
1. tick()中修改fixed_count的有效性
直接在tick()里修改UserClass.fixed_count完全无效——fixed_count是静态初始配置属性,Locust运行时不会监听这个值的变化来自动创建用户实例。你改了数值,但Locust不会触发任何新用户启动逻辑,根本达不到扩展效果。
正确操作是:在tick()里判断用户数阈值达标后,调用env.runner.start_user_class(YourSpecialUserClass, count=需要新增的数量),这才会实际启动新的用户实例。
2. 分布式模式下的兼容性
直接修改fixed_count在分布式环境下彻底失效:每个Worker节点的user_classes是独立副本,Master节点的修改不会同步到Worker。
用start_user_class()则完全适配分布式场景——Master会把用户启动指令分发到各个Worker,配合重平衡机制,Worker会自动分配新用户实例,这是分布式负载测试的标准做法。
3. on_start日志仅显示初始状态的原因
你只是修改了fixed_count的数值,但没有实际启动新的用户实例,所以on_start只会在初始的1个用户启动时执行一次,后续没有新实例启动,自然没有日志输出。改用start_user_class()启动新用户后,每个新实例都会触发on_start,就能看到对应日志了。
4. LoadShapeClass中设置重平衡的正确方式
不要直接修改users_dispatcher._rebalance这类私有属性——这是Locust内部实现细节,版本迭代时很可能变动,属于不稳定的依赖。
代码层面开启重平衡的正确姿势:在LoadShapeClass的初始化方法里,通过self.env.runner.user_dispatcher.enable_rebalancing = True来设置(如果已经通过配置文件/命令行开启enable-rebalancing,这一步可以省略,但显式设置也不冲突)。另外,当你调用start_user_class()添加用户时,只要重平衡已开启,Locust会自动触发重平衡逻辑,无需手动调用内部方法。
内容的提问来源于stack exchange,提问作者Dave

