如何在Locust多任务中共享company_id,实现员工并行创建?
可行方案:拆分Locust任务并行创建员工
完全可以实现。你只需要将company_id存储为HttpUser实例的属性,这样不同任务之间就能共享这个值。以下是具体的实现方式:
方案1:每个用户实例独立创建公司和员工
这种方式下,每个Locust用户会先创建自己的公司,然后持续为该公司创建员工,多个用户之间可以并行执行员工创建任务:
from locust import HttpUser, task class CompanyAPI(HttpUser): def on_start(self): # 启动时先创建公司,确保后续任务有可用的company_id resp = self.client.post( "/companies", json={"name": "Company Name"} ) self.company_id = resp.json()["id"] @task(10) # 权重设高,让这个任务执行更频繁 def create_employee(self): self.client.post( "/employees", json={ "first_name": self.locust_name, # 用用户标识区分员工,也可以用随机字符串 "last_name": "Smith", "company": self.company_id, }, )
这里用on_start方法在用户启动时自动创建公司,避免依赖任务调度的随机性,确保员工创建任务能拿到有效的company_id。
方案2:所有用户共享同一个公司ID
如果希望所有Locust用户都为同一个公司创建员工,需要用全局变量加线程锁来保证公司只被创建一次:
from locust import HttpUser, task import threading # 全局变量存储共享的公司ID,线程锁保证创建操作的原子性 shared_company_id = None company_lock = threading.Lock() class CompanyAPI(HttpUser): def on_start(self): global shared_company_id with company_lock: if not shared_company_id: resp = self.client.post( "/companies", json={"name": "Shared Company Name"} ) shared_company_id = resp.json()["id"] # 将共享ID赋值给实例属性,方便后续任务调用 self.company_id = shared_company_id @task(10) def create_employee(self): self.client.post( "/employees", json={ "first_name": f"{self.locust_name}_emp", "last_name": "Smith", "company": self.company_id, }, )
关键说明
- 利用
HttpUser的实例属性(如self.company_id)可以在同一用户的不同任务间共享数据 on_start方法会在每个用户实例启动时执行一次,适合做初始化操作- 通过调整任务权重(
@task(n))可以控制不同任务的执行频率,让员工创建任务更频繁 - 多用户并行执行时,每个用户的员工创建请求会同时发送,自然实现了员工的并行创建
内容的提问来源于stack exchange,提问作者user27930
相关产品推荐
相关产品推荐

