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

如何实现Locust按指定顺序异步发起无等待响应的POST API测试

解决Locust中按顺序异步发起POST API请求的问题

之前用独立任务+条件判断的方案没法保证请求顺序,核心原因是Locust的任务调度器会随机挑选独立任务执行,无法严格控制先后顺序。要实现按指定顺序发起请求且无需等待前序响应,可以把所有请求封装到同一个任务中,用异步或线程方式实现无阻塞的顺序发起。

方案1:异步模式(推荐,Locust原生支持)

使用Locust的HttpUser异步特性,结合asyncio.create_task逐个发起请求,既保证顺序,又不等待前序请求响应。

from locust import HttpUser, task
import asyncio

class SequentialAPIUser(HttpUser):
    @task
    async def ordered_async_post_requests(self):
        # 按业务需求定义API顺序、URL和请求体
        api_sequence = [
            ("/api/v1/first-endpoint", {"data": "first_payload"}),
            ("/api/v1/second-endpoint", {"data": "second_payload"}),
            # 可扩展更多API
        ]

        # 按顺序发起每个请求,不等待响应
        for api_url, payload in api_sequence:
            # 创建异步任务并立即调度,主线程继续执行下一个请求
            asyncio.create_task(
                self.client.post(api_url, json=payload)
            )

        # (可选)如果需要等待所有请求完成再结束当前任务,取消下方注释
        # tasks = []
        # for api_url, payload in api_sequence:
        #     task = asyncio.create_task(self.client.post(api_url, json=payload))
        #     tasks.append(task)
        # await asyncio.gather(*tasks)

关键说明:

  • 所有请求逻辑放在同一个@task装饰的函数内,完全控制内部执行顺序
  • asyncio.create_task会立即调度请求任务,主线程不阻塞,继续发起下一个请求,保证发起顺序严格遵循api_sequence的定义
  • 若需记录请求结果,可在create_task的回调中处理(比如添加异常捕获、日志记录)

方案2:同步模式下用线程实现

如果你的测试代码基于同步HttpUser,可以用线程来实现无阻塞的顺序发起:

from locust import HttpUser, task
import threading

class SequentialAPIUser(HttpUser):
    @task
    def ordered_threaded_post_requests(self):
        api_sequence = [
            ("/api/v1/first-endpoint", {"data": "first_payload"}),
            ("/api/v1/second-endpoint", {"data": "second_payload"}),
        ]

        for api_url, payload in api_sequence:
            # 启动线程执行POST请求,主线程不阻塞,继续下一个
            threading.Thread(
                target=self.client.post,
                args=(api_url,),
                kwargs={"json": payload}
            ).start()

注意事项:

  • 两种方案都会短时间内发起多个请求,需根据服务端的承载能力调整用户数、孵化率,避免压垮服务
  • 若需要严格保证请求的处理顺序(而非仅发起顺序),则必须等待前序请求响应后再发起下一个,但这不符合你“无需等待前序响应”的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:03:40