首页 > 解决方案 > 如何在 locust 的工作实例中访问环境类上设置的变量

问题描述

我有一个自定义的 locust 分支,我将自定义 UI 字段添加到 locust 的启动和编辑屏幕。我已将字段添加到index.html. 在web.py/swarm 方法中,我将来自新 UI 字段的请求结果添加到环境变量中。

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

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

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

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

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

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

标签: pythonlocust

解决方案


首先,您可以考虑添加自己的 Web 路由扩展 Web UI 以添加您需要的自定义逻辑和数据,而不是维护自己的 Locust 分支。从维护的角度来看,长期来看可能对您更好。

至于将这些数据提供给工作人员,您可以创建一个他们可以调用的网络路由,您可以在 test start 上执行此操作,或者您可以从主服务器向工作人员发送消息。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)

推荐阅读