一、前言
环境: window 10 Jmeter 5.3
二、逻辑控制器
1 临界部分控制器
这个翻译的名字感觉挺拗口的,和边界其实也没啥关系,大家都这样叫,就随大流吧
The Critical Section Controller ensures that its children elements (samplers/controllers, etc.) will be executed by only one thread as a named lock will be taken before executing children of controller
上面是官网对它的介绍,翻译过来大概是
临界区控制器确保其子元素(采样器/控制器等)将只由一个线程执行,因为在执行控制器的子元素之前将获得一个命名锁
个人理解的意思是,一个线程在执行该控制器下的子节点时,会生成一把锁锁住该控制器,其它线程进不来暂时无法执行该控制器,只能等锁释放后由其它线程执行。该控制器的子节点在同一时间将只能被一个线程执行(这让我想到了mysql里面的不同级别的锁的机制),也就是说在多线程的情况下,该控制器下的子节点是一个线程执行完了才有另一个线程执行
如上,控制器的输入数据也挺简单,名字和锁名
1.1 例子
该控制器由于只能被一个线程执行,我们就设置多个线程,在有控制器和无控制器2个场景对比下
有控制器的情况
查看结果树
如上,会发现执行顺序很有规律 1234 1234 ,而且是第一个线程的1234执行完后再执行第二个线程的1234再是后面线程
无控制器的情况
查看结果树
如上,一眼看去,执行结果比较混乱,但看详细信息会发现,对于单个线程来说,子节点的执行顺序仍是我们定义事的顺序1234,只不过在一个线程执行的中间,有另外一个并发线程的接口在执行
1.2 其它
看其它博主的分享,说是多线程情况下,锁名是不变的话,每个线程都会遇到同一个锁锁住控制器,只有在一个线程的控制器执行完成释放锁后,另一个线程才能执行同时再次锁住控制器,这就变成一个串行的过程,执行时间会增加,这样就达不到压力测试的并行执行的要求
如果锁名是动态变化的话,每个线程拿到的是不同的锁,他们之间互不影响,这样控制器就能并行执行了(有点像mysql中更低级别的锁),总的执行时间减少
以上锁名动态而并行的观点,在官方并未给出解释,本人也无法验证锁名动态的情况下就是在并行处理,不过执行时间确实可以减少
锁名动态的话,名字可以为空,或者用线程数或者随机数命名,这样名字就不会重复
如下是一个例子
如上 ,这样好像和不用该控制器效果是一致的,这样用它的意义是什么呢
有没有用临界部分控制器的动态锁同时保证接口的执行顺序完全和定义的一样呢,
经过多方查证,终于看到有前辈实现了,是在控制器前面再加一个事务控制器,同时勾选事务控制器的第一个选项
如下
执行
至于锁名动态变化,多线程状态下,如何控制器是否并行运行,个人暂时无法验证,请朋友们献言献策
标签:1234,控制器,Jmeter,多线程,锁名,逻辑,线程,执行 From: https://www.cnblogs.com/MyRecords/p/17999376