【问题标题】:How do you know if a Locust instance is running as master or worker?您如何知道 Locust 实例是作为 master 还是 worker 运行?
【发布时间】:2019-08-12 19:06:50
【问题描述】:

这是我想做的一个简单示例。

in想运行和平码只有当它是master。

class SimpleTaskSet(TaskSet):

    @task
    def do_something(self):
        # do something ...
        pass


class MyOwnLocust(Locust):
    task_set = SimpleTaskSet
    min_wait = 1
    max_wait = 10

    def setup(self):
        if master:  # How to here the code is running on master?
            # do something
            pass
        else:
            # do something else
            pass

【问题讨论】:

    标签: python python-3.x performance-testing load-testing locust


    【解决方案1】:

    为了检查一个locust是master还是slave,你可以使用locust中的runners,然后检查当前runner是否是Master的实例:

    from locust import runners
    
    ... # Your code
    
    def setup(self):
        if isinstance(runners.locust_runner, runners.MasterLocustRunner):
            # do something
            pass
        else:
            # do something else
            pass
    

    但是,请记住,蝗虫大师不执行任务,也不会像蝗虫奴隶一样完成所有功能。

    编辑-第二个问题

    据我所知,鉴于 Locust 的工作方式,为整个测试只运行一段代码可能非常棘手。

    你可以做的第一件事是使用TaskSet方法setup

    class Behavior(TaskSet):
        def setup(self):
            # Do things only once here
    
        # The rest of your code
    
    
    class User(HttpLocust):
        task_set = Behavior
        # ....
    

    您可以在官方文档中阅读更多关于 setup / on_start / on+stop 等的信息:https://docs.locust.io/en/stable/writing-a-locustfile.html?highlight=setup#setups-teardowns-on-start-and-on-stop

    现在,这个设置有什么问题?我不知道您要在此设置部分中实现什么目标,但请务必记住,此函数每次测试仅运行一次,但每个进程仅运行一次。

    这是什么意思?如果你在分布式模式下运行 Locust 测试(主从设置),setup 函数将为每个 python 进程运行一次(也就是你开始测试的每个单独的从终端)。

    如果这对您来说不是问题,您可以轻松地使用设置功能来实现您想要实现的目标。但是,如果不是,您可能需要想出一种方法让 Locust 进程相互了解,以便它们可以检查是否还需要运行 setup 的内容或跳过该块,因为从属进程已经运行它。这可能会变得很棘手。

    【讨论】:

    • 非常感谢@alin-luga 的回答,特意说明master不会运行!你有/知道任何关于我如何让一段代码只由一个奴隶执行的例子吗?或者甚至是我可以尝试的未经测试的方法?
    • 再次感谢@aliniuga!根据您提到的文档,我知道setupon_start!但我真的想创建一些仅与奴隶数量无关的资源。我正在查看 Locust 代码,可能我会通过主从之间的一些自定义事件挂钩来实现这一点。
    【解决方案2】:

    根据 locust 文档https://docs.locust.io/en/stable/writing-a-locustfile.html#test-start-and-test-stop-events,test_start 事件只会在以分布式模式运行时在 master 上运行。 test_start 事件将在 locust init 事件之后发生。 您还可以在模块级别使用上述技巧检查节点类型,并在任何工作人员或任务孵化之前运行代码。 看到这个有点过时(蝗虫0.9)的例子https://medium.com/locust-io-experiments/locust-experiments-feeding-the-locusts-cf09e0f65897

    【讨论】:

    • 欢迎来到stackoverflow!您可能想尝试从所引用的网站中引入细节,因为这些网站本身可能会更改或消失,这会使您的答案毫无用处。
    【解决方案3】:

    Locust docs 显示这个例子:

    @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)
    

    这对 OP 的问题没有直接用处,但您可以通过 User 类访问 environment.runner。我在 Locust 2.5.1 中使用它如下:

    @events.test_stop.add_listener
    def test_stop(**kw):
        if ('environment' in kw):
            if isinstance(kw['environment'].runner, MasterRunner):
                MySequentialTaskSet.print_stats()
    

    【讨论】:

      猜你喜欢
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2013-02-04
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多