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

如何让Locust虚拟用户依次遍历TS_IDs列表执行请求?

解决方案

原脚本的核心问题是全局预生成的values_new仅包含单个请求体(因原values列表只有一个元素),所有虚拟用户复用同一请求体,导致始终使用第一个TS_ID。要实现每个虚拟用户依次遍历TS_IDs,可按以下两种方案修改:

方案1:每个用户独立维护遍历进度

每个虚拟用户拥有专属的TS_ID迭代器,遍历完所有ID后可循环重置:

from locust import HttpUser, between, task
import copy

TS_IDs = [
    '10158',
    '11016',
    '10479',
    '10482',
    '11045',
    '10311',
    '10159'
]

# 基础请求体模板
values_template = {
    "id": 219468,
    "values": [
        {
            "from": "2023-07-04T08:00:00.000Z",
            "to": "2023-07-04T09:00:00.000Z",
            "value": 33
        }
    ]
}

class SaveValues(HttpUser):
    wait_time = between(1, 3)  # 可根据测试需求调整任务间隔
    
    def on_start(self):
        # 每个用户初始化时创建专属的TS_ID迭代器
        self.ts_iter = iter(TS_IDs)
    
    def _run_write_ts(self, ts_id):
        # 每次请求深拷贝模板,替换为当前TS_ID
        req_body = copy.deepcopy(values_template)
        req_body["id"] = ts_id
        resp = self.client.put(
            '/api/SaveValues', 
            json=req_body,
            headers={'X-API-KEY': 'AKjCg9hTcYQ=', 'Content-Type': 'application/json'}
        )
        print(f"TS_ID: {ts_id}, 响应状态码: {resp.status_code}")

    @task(1)
    def test_save_ts_1(self):
        try:
            current_ts = next(self.ts_iter)
        except StopIteration:
            # 遍历完所有ID后重置迭代器,实现循环遍历
            self.ts_iter = iter(TS_IDs)
            current_ts = next(self.ts_iter)
        self._run_write_ts(current_ts)

方案2:所有用户共享全局遍历顺序

如果需要让所有虚拟用户按统一顺序依次取用TS_ID(比如用户1用第一个ID,用户2用第二个ID),可使用全局循环迭代器:

from locust import HttpUser, between, task
import copy
from itertools import cycle

TS_IDs = [
    '10158',
    '11016',
    '10479',
    '10482',
    '11045',
    '10311',
    '10159'
]

values_template = {
    "id": 219468,
    "values": [
        {
            "from": "2023-07-04T08:00:00.000Z",
            "to": "2023-07-04T09:00:00.000Z",
            "value": 33
        }
    ]
}

# 全局循环迭代器,所有用户共享遍历序列
global_ts_cycle = cycle(TS_IDs)

class SaveValues(HttpUser):
    wait_time = between(1, 3)
    
    def _run_write_ts(self, ts_id):
        req_body = copy.deepcopy(values_template)
        req_body["id"] = ts_id
        resp = self.client.put(
            '/api/SaveValues', 
            json=req_body,
            headers={'X-API-KEY': 'AKjCg9hTcYQ=', 'Content-Type': 'application/json'}
        )
        print(f"TS_ID: {ts_id}, 响应状态码: {resp.status_code}")

    @task(1)
    def test_save_ts_1(self):
        current_ts = next(global_ts_cycle)
        self._run_write_ts(current_ts)

关键修改说明

  1. 模板复用:将原values改为单个模板字典,避免全局预生成固定请求体,每次请求动态生成对应ID的请求体。
  2. 迭代器管理:
    • 方案1适合模拟每个用户按自身顺序遍历ID的场景,每个用户独立维护遍历进度。
    • 方案2适合所有用户按统一顺序依次使用ID的场景,通过全局迭代器保证顺序一致性。
  3. 深拷贝模板:每次请求都深拷贝模板,避免多个请求共享同一字典导致的ID覆盖问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:27:00