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

如何在Locust中模拟并行请求?新手寻求类似LoadRunner/JMeter的方案

Locust实现并行请求的方案

Locust可以通过其底层依赖的gevent协程库实现类似LoadRunner的web_concurrent_start或JMeter并行控制器的效果,模拟真实场景下的并行请求行为,避免串行请求导致的总耗时累加问题。

具体实现代码示例

首先导入必要的模块:

from locust import HttpUser, task, between
from gevent import spawn, joinall

编写用户类,实现并行请求逻辑:

class ParallelRequestUser(HttpUser):
    wait_time = between(1, 3)

    @task
    def trigger_parallel_actions(self):
        # 定义需要并行执行的请求操作
        def fetch_endpoint1():
            self.client.get("/api/first-endpoint")
        
        def submit_form_data():
            self.client.post("/api/submit-form", json={"username": "test", "password": "123"})
        
        def load_static_resource():
            self.client.get("/static/assets/image.png")
        
        # 为每个请求创建协程并启动
        request_jobs = [
            spawn(fetch_endpoint1),
            spawn(submit_form_data),
            spawn(load_static_resource)
        ]
        
        # 等待所有并行请求完成
        joinall(request_jobs)

关键逻辑说明

  • 使用gevent.spawn为每个请求创建独立的协程,这些协程会同时启动执行,而非串行等待前一个请求结束。
  • joinall方法会阻塞当前任务,直到所有并行请求都处理完成,确保任务的结束点与真实用户操作逻辑一致。
  • 这种方式下,事务的响应时间会等于三个请求中耗时最长的那个,而非三者耗时总和,完全符合真实场景的请求行为。

简化写法

如果请求逻辑较为简单,也可以用更简洁的方式实现:

@task
def simplified_parallel_request(self):
    # 用lambda表达式定义并行请求
    parallel_tasks = [
        lambda: self.client.get("/api/endpoint-a"),
        lambda: self.client.post("/api/endpoint-b", data={"key": "value"}),
        lambda: self.client.get("/api/endpoint-c")
    ]
    
    # 批量创建并启动协程,等待全部完成
    joinall([spawn(task) for task in parallel_tasks])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:42:38