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

busgade · November 19, 2019 · Last by busgade replied at November 26, 2019 · 1327 hits

我启动了两个slave

参数化代码

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

共收到 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 回复

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up