You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter:如何在控制器下限制特定线程运行指定端点请求?

解决方案分析

一、无需新建线程组的最佳实现:信号量(Semaphore)控制并发

你之前用Throughput Controller无效,是因为它控制的是总执行次数,而非同时运行的线程数。要限制"Agro B"端点的并发数,最可靠的方案是用Java的信号量机制,通过JSR223 Sampler实现:

具体步骤:

  1. 全局初始化信号量
    在测试计划根节点添加User Defined Variables,定义变量agroB_max_concurrent=2(指定最大并发数)。
    然后在你的主控制器前,添加一个JSR223 Sampler(选择Groovy语言),写入初始化代码:

    import java.util.concurrent.Semaphore
    
    // 全局唯一信号量,放在props(JVM级变量)中避免重复初始化
    if (!props.containsKey("agroBSemaphore")) {
        props.put("agroBSemaphore", new Semaphore(Integer.parseInt(vars.get("agroB_max_concurrent"))))
    }
    def semaphore = props.get("agroBSemaphore")
    semaphore.acquire() // 获取许可,没有许可则阻塞等待
    vars.put("has_acquired_semaphore", "true") // 标记已获取许可
    
  2. 释放信号量
    在"Agro B"端点的所有请求执行完成后,添加另一个JSR223 Sampler,写入释放代码:

    if (vars.get("has_acquired_semaphore") == "true") {
        def semaphore = props.get("agroBSemaphore")
        semaphore.release() // 释放许可,让其他线程可以获取
        vars.put("has_acquired_semaphore", "false")
    }
    

方案优势:

  • 所有请求在同一个线程组内,用户上下文(如登录态、会话数据)自动共享,无需额外处理。
  • 精准控制并发数,即使线程组循环多次或持续运行,始终保持最多2个线程执行"Agro B"。
  • 资源占用低,信号量是轻量级的并发控制工具。

二、新建线程组的方案是否更优?

如果"Agro B"是独立于主流程的测试场景(不需要共享主线程组的用户状态),新建线程组是更直观的选择:

具体操作:

  1. 保留原有的600用户线程组,处理其他业务请求。
  2. 新建一个Concurrency Thread Group,设置并发数为2,专门处理"Agro B"端点的请求。

方案优劣:

  • 优点:配置可视化,无需编写代码;可以独立控制"Agro B"的执行逻辑(如循环次数、持续时间),和主流程完全解耦。
  • 缺点:如果"Agro B"依赖主线程组的用户数据(如已登录的会话ID),需要额外通过全局变量(props)、CSV文件或数据库传递上下文,配置复杂度提升;线程组的执行时序需要协调(比如主线程组先完成登录,再启动"Agro B"线程组)。

三、方案选择建议

  • 如果"Agro B"是主业务流程中的一个步骤,需要和其他请求共享用户上下文 → 优先选择信号量方案。
  • 如果"Agro B"是独立的测试场景,无需依赖主流程数据 → 选择新建线程组方案更简单。

内容的提问来源于stack exchange,提问作者newnick988888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:08:28