动态创建蝗虫任务?

Posted

技术标签:

【中文标题】动态创建蝗虫任务?【英文标题】:Create locust tasks dynamically? 【发布时间】:2020-10-08 19:53:02 【问题描述】:

基本上我需要生成 30 个用户并为他们处理 50 个不同的任务,我需要他们并行运行。所以我正在尝试生成 50 个任务,如下所示:

class UserSimulation(HttpUser):
    host = os.environ['BASE_URL']

    # time in seconds the simulated user will wait before proceeding to the next task
    wait_time = between(1, 2)

    for item_id in range(1, 51):

        @task(1)
        def view_items_with_different_item_ids(self, item_id=item_id):
            self.client.get(
                url=f"/my-url/item24_00item_id",
                verify=False,
                auth=(os.environ['USERNAME'], os.environ['PASSWORD'])

由于显而易见的原因,这种方法不允许我动态创建 50 个任务,因为只有最后一个被保存。有什么解决方法的想法吗?

【问题讨论】:

【参考方案1】:

要按照您尝试的方式进行操作,请尝试creating different functions programmatically。我不知道如何使用装饰器,但如果没有别的,你可以在创建它们时将这些函数添加到 Locust 任务列表中。只需在创建函数时创建一个任务列表tasks = [] 然后tasks.append(view_items_with_different_item_ids_1)

但是,根据您对所需内容的描述,我不肯定是否有必要这样做。如果您只需要 30 个用户进行 50 次调用,那么您只需要一项任务,就可以在其中循环调用。

class UserSimulation(HttpUser):
    host = os.environ['BASE_URL']

    # time in seconds the simulated user will wait before proceeding to the next task
    wait_time = between(1, 2)

    @task(1)
    def view_items_with_different_item_ids(self):
        for item_id in range(1, 51):
            self.client.get(
                url=f"/my-url/item24_00item_id",
                verify=False,
                auth=(os.environ['USERNAME'], os.environ['PASSWORD'])

如果您需要一个随机数而不是一个连续的数字,但需要确保每个数字都被调用一次:

    import random

    item_ids = list(range(1,51))
    random.shuffle(item_ids)
    @task(1)
    def view_items_with_different_item_ids(self):
        for item_id in item_ids:
            self.client.get(
                url=f"/my-url/item24_00item_id",
                verify=False,
                auth=(os.environ['USERNAME'], os.environ['PASSWORD'])

如果你只是想一直拉一个随机数而不关心重复:

    import random

    item_ids = list(range(1,51))
    @task(1)
    def view_items_with_different_item_ids(self):
        random_id = random.choice(item_ids)
        self.client.get(
            url=f"/my-url/item24_00random_id",
            verify=False,
            auth=(os.environ['USERNAME'], os.environ['PASSWORD'])

【讨论】:

如果我按照您的建议进行操作,并在任务中循环,那么模拟用户将依次访问每个 url。但是,我需要的是并行运行这些任务。我基本上需要生成 30 个用户并为每个用户执行 50 个任务。这些任务应该由用户随机选择。 任务不是由用户并行运行的。即使你有 50 个任务,它们也不会一次运行全部 50 个,一次只运行一个。但我会更新我的答案,除了顺序之外还包括一个随机性示例。

以上是关于动态创建蝗虫任务?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建动态计划任务?

动态创建管理定时任务-已完成

对xxl-job进行simpleTrigger并动态创建任务扩展

根据气流中 sql 查询的结果创建动态任务

spring实现动态定时任务

Springboot定时任务原理及如何动态创建定时任务