如何在蝗虫的工作实例中访问环境 class 上的变量集

How to access an variable set on the environment class in a worker instance in locust

我有一个自定义的 Locust 分支,我正在向其中添加自定义 UI 字段到 Locust 的开始和编辑屏幕。我已将字段添加到 index.html 中的现有表单。在 web.py 上,在 /swarm 方法中,我将来自新 UI 字段的请求结果添加到环境变量中。

现在在我的 locust 文件中,我可以在一个事件 class 中从环境访问这些变量,如下所示:

@events.test_start.add_listener
def test_start(environment):
    print(environment.variable1)
    print(environment.host)

问题是它只在 Locust 的主实例上运行。我需要我的 HTTP 用户 class 的 on_start 方法中的数据。我认为这是可能的,因为在 HHTP 用户 class 内部我可以获得 self.environment.host 并且它会正确填充但是如果我这样做 self.environment.variable1 它总是在 None 返回。

我将新变量添加到 env.py 中 env class 的顶部,并在 /swarm 块中设置 web.py 中的变量,如下所示:

environment.variable1 = request.form["variable1"]

我认为问题是 WebUI class 仅在主实例上产生,但这个问题仍然以某种方式被主机绕过。预先感谢您的帮助。

首先,与其维护自己的 Locust 分支,不如考虑 adding your own web routes and extending the web UI to add the custom logic and data that you need。从维护的角度来看,从长远来看可能对您更好。

就将数据发送给工作人员而言,您可以创建一个他们可以调用的 Web 路由,您可以 on test start, or you could send a message 从主服务器到工作人员。 Locust 文档中的示例:

from locust import events
from locust.runners import MasterRunner, WorkerRunner

# Fired when the worker recieves a message of type 'test_users'
def setup_test_users(environment, msg, **kwargs):
    for user in msg.data:
        print(f"User {user['name']} recieved")
    environment.runner.send_message('acknowledge_users', f"Thanks for the {len(msg.data)} users!")

# Fired when the master recieves a message of type 'acknowledge_users'
def on_acknowledge(msg, **kwargs):
    print(msg.data)

@events.init.add_listener
def on_locust_init(environment, **_kwargs):
    if not isinstance(environment.runner, MasterRunner):
        environment.runner.register_message('test_users', setup_test_users)
    if not isinstance(environment.runner, WorkerRunner):
        environment.runner.register_message('acknowledge_users', on_acknowledge)

@events.test_start.add_listener
def on_test_start(environment, **_kwargs):
    if not isinstance(environment.runner, MasterRunner):
        users = [
            {"name": "User1"},
            {"name": "User2"},
            {"name": "User3"},
        ]
        environment.runner.send_message('test_users', users)