如何在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
相关产品推荐
相关产品推荐

