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

如何将一组并行请求在统计中显示为单次请求?

解决方案

问题核心是当前每个子请求都会被框架自动统计,要把整组并行请求合并为一次统计记录,可通过以下两种思路实现:

思路1:绕过框架自动统计,手动上报整体请求

直接用原生requests库发送子请求,避开测试框架的自动统计机制,等所有并行请求完成后,根据整体结果手动向统计系统上报一次记录。

修改后的代码示例:

import time
import requests
from locust import task, Group

@task
def get_test(self):
    # 存储每个子请求的结果与耗时
    request_results = []

    def func_query(url: str):
        start_time = time.time()
        try:
            # 用requests直接发起请求,不经过框架client,避免自动统计
            resp = requests.get(url)
            resp.raise_for_status()  # 抛出HTTP错误
            request_results.append((True, time.time() - start_time))
        except Exception as e:
            request_results.append((False, time.time() - start_time))

    # 启动并行任务
    group = Group()
    for url in url_list:
        group.spawn(func_query, url)
    group.join()

    # 自定义整体成功判定规则(示例:全部子请求成功才算整体成功)
    all_succeeded = all(result[0] for result in request_results)
    # 并行请求总耗时取最长的子请求耗时
    total_elapsed = max(result[1] for result in request_results)

    # 手动上报统计记录
    stats_entry = self.environment.stats.get_or_create("GET", "batch_parallel_requests")
    if all_succeeded:
        stats_entry.success(total_elapsed)
    else:
        stats_entry.failure(total_elapsed, "部分子请求失败")

思路2:禁用子请求统计标识,统一合并统计

如果不想更换请求库,可给每个子请求设置临时忽略的name,并通过catch_response控制统计逻辑,最后手动合并为一次统计。

示例代码(以Locust为例):

import time
from locust import task, Group

@task
def get_test(self):
    success_count = 0
    total_count = len(url_list)
    max_elapsed = 0

    def func_query(url: str):
        nonlocal success_count, max_elapsed
        start_time = time.time()
        with self.client.get(url, catch_response=True, name="temp_ignore") as resp:
            elapsed = time.time() - start_time
            if elapsed > max_elapsed:
                max_elapsed = elapsed
            try:
                resp.raise_for_status()
                success_count += 1
                # 不调用resp.success(),避免触发单次统计
            except:
                pass

    group = Group()
    for url in url_list:
        group.spawn(func_query, url)
    group.join()

    # 上报整体统计
    stats_entry = self.environment.stats.get_or_create("GET", "batch_parallel_requests")
    if success_count == total_count:
        stats_entry.success(max_elapsed)
    else:
        stats_entry.failure(max_elapsed, f"{total_count - success_count}个子请求失败")

核心逻辑:阻止每个子请求触发单独统计,等整组并行任务完成后,根据整体执行结果手动上报一次统计记录,这样统计数据里就只会显示1次请求,RPS也会按任务的执行次数计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:43:13