如何将一组并行请求在统计中显示为单次请求?
解决方案
问题核心是当前每个子请求都会被框架自动统计,要把整组并行请求合并为一次统计记录,可通过以下两种思路实现:
思路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
相关产品推荐
相关产品推荐

