问答 locust 启动多个 salve 后,参数化失效,求解决办法

busgade · 2019年11月19日 · 最后由 busgade 回复于 2019年11月26日 · 3790 次阅读

我启动了两个 slave

参数化代码

但是执行时,不断的在报错,有一部分一直在失败,我觉得应该是两个 salve 在并发时,存在重复调用了同一个参数造成的,
接口返回也提示接口参数以重复。我一个 slave 启动就没问题,没报错,请教各位,这种多个 slave 的参数化,该怎么设置,怎么才能
让不同 slave 调用不同的参数呢

最佳回复
busgade 回复

因为 locust 的分布式是跨进程的,你的 2 个 slave,对应 2 个进程。你代码里边的 queue,在 2 个进程里边实际上是 2 个实例。相当于 slave1 消费 queue1,slave2 消费 queue2【你可以打印 telqueue 的 ID,肯定是不一样的】所以有提示 userCode 重复。

上面建议你使用 multiprocess 进程的 queue 通信的方式,2 个进程都从一个 Q 中取任务消费,应该不会重复了。

目前有以下解决方案
①:如果你对于 userCode 没有强制的范围要求,只要不同就可以的话。可以一个 rang(1,20w),另外一个 (20w, 40w)。
②:你把 from multiprocessing import Queue 不要放到类里边,你放到最外层。
③:如果以上方法都不行,你可以 google 下如何实现进程间数据共享。
④:如果以上都不行的话,而你必须得用 range(1,20w), 最最挫的方式,你搭个 redis,把所有的数据都放到 redis 里边。userCode,从 redis 里边取。-_-||。

如果以上都不行,我就没招了。

共收到 10 条回复 时间 点赞

@debugtalk 大佬,这个问题我想你肯定知道,能帮下我吗

你参数化范围(i)都是一样的冲突不是很正常么?试试随机?或者看看 locust 有没有参数传递进来控制一下。

busgade 回复

queue 换成这个:from multiprocessing import Queue 试试看。

0x7C00 回复

怎么用,不太懂,我试了还是不行,有没代码参考呢,大佬

busgade 回复

因为 locust 的分布式是跨进程的,你的 2 个 slave,对应 2 个进程。你代码里边的 queue,在 2 个进程里边实际上是 2 个实例。相当于 slave1 消费 queue1,slave2 消费 queue2【你可以打印 telqueue 的 ID,肯定是不一样的】所以有提示 userCode 重复。

上面建议你使用 multiprocess 进程的 queue 通信的方式,2 个进程都从一个 Q 中取任务消费,应该不会重复了。

目前有以下解决方案
①:如果你对于 userCode 没有强制的范围要求,只要不同就可以的话。可以一个 rang(1,20w),另外一个 (20w, 40w)。
②:你把 from multiprocessing import Queue 不要放到类里边,你放到最外层。
③:如果以上方法都不行,你可以 google 下如何实现进程间数据共享。
④:如果以上都不行的话,而你必须得用 range(1,20w), 最最挫的方式,你搭个 redis,把所有的数据都放到 redis 里边。userCode,从 redis 里边取。-_-||。

如果以上都不行,我就没招了。

0x7C00 回复

@busgade 按照 @0x7C00 的方案是可以的。简单场景就按照 1,复杂场景就按照 4,单独搭了个 Redis 作为公共的数据队列。

0x7C00 回复

感谢,上班忙现在才看到,请问你说的第一种方式,一个多少万,一个多少万,怎么在代码里实现,我定义两个队列怎么让第一个 slave 调这个队列,另一个 slave 又调另一个队列啊

最快的分别启动不一样的数据遍历段就行了。上面好像讲到了。
全局设置共享内存还是会竞态的,一定只想随机用同一组,取余%2==0 给 A 用和 %2==1 给 B 用就好了。

陈子昂 回复

你说的我懂了,这段代码描述是在哪里实现的呢,是在 TaskSet 类里面吗,针对两个进程的话,代码里是放在同一个@task装饰器里写还是放在两个@task装饰器里写?我实在不知道这个多进程是在哪里代码实现的,大佬能给点思路不

debugtalk 回复

大佬,我弄了几天还是不行,能说下第一种具体怎么实现吗?

busgade 关闭了讨论 12月16日 10:27
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册