Pause/Delay 从 swarm 发送新一批用户

Pause/Delay sending of new batch of users from swarm

我有一个测试用例,我需要生成 1000 个 websocket 连接并通过 Locust 任务维持对它们的对话(它有一个用于 websocket 连接的预定义 send/receive 进程)。我可以通过以下蝗虫设置成功地做到这一点:

最大用户数:1000 孵化率:1000

但是,此设置每秒打开 1000 个连接。即使我降低孵化率,它也会持续每秒产生 1000 个 websocket 连接。有没有办法立即产生 1000 个用户,并且 halt/delay 群在相当长的一段时间内发送新的 1000 个连接?

我正在尝试测试我的服务器是否可以处理 1000 个用户通过 websocket 连接从我的服务器发送和接收消息。我在 python 中尝试过多处理方法,但我很难用 Locust 尽可能快地生成连接。

class 用户行为(任务集):

statements = [
    "Do you like coffee?",
    "What's your favorite book?",
    "Do you invest in crypto?",
    "Who will host the Superbowl next year?",
    "Have you listened to the new Adele?",
    "Coldplay released a new album",
    "I watched the premiere of Succession season 3 last night",
    "Who is your favorite team in the NBA?",
    "I want to buy the new Travis Scott x Jordan shoes",
    "I want a Lamborghini Urus",
    "Have you been to the Philippines?",
    "Did you sign up for a Netflix account?"

              ]



def on_start(self):
    pass


def on_quit(self):
    pass

@task
def send_convo(self):
    end = False
    ws_url = "ws://xx.xx.xx.xx:8080/websocket"
    self.ws = create_connection(ws_url)
    body = json.dumps({"text": "start blender"})
    self.ws.send(body)
    while True:
        #print("Waiting for response..")
        response = self.ws.recv()

        if response != None:
           if "Sorry, this world closed" in response:
               end = True
        break

    if not end:
        body = json.dumps({"text": "begin"})
        self.ws.send(body)
        while True:
            #print("Waiting for response..")
            response = self.ws.recv()
            if response != None:
                # print("[BOT]: ", response)
                if "Sorry, this world closed" in response:
                    end = True
                    self.ws.close()
                break

    if not end:
        body = json.dumps({"text": random.choice(self.statements)})
        start_at = time.time()
        self.ws.send(body)
        while True:
            response = self.ws.recv()
            if response != None:
                if "Sorry, this world closed" not in response:
                    response_time = int((time.time() - start_at)*1000)
                    print(f"[BOT]Response: {response}")
                    response_length = len(response)
                    events.request_success.fire(
                        request_type='Websocker Recv',
                        name='test/ws/echo',
                        response_time=response_time,
                        response_length=response_length,
                    )
                else:
                    end = True
                    self.ws.close()
                break

    if not end:
        body = json.dumps({"text": "[DONE]"})
        self.ws.send(body)
        while True:
            response = self.ws.recv()
            if response != None:
                if "Sorry, this world closed" in response:
                    end = True
                    self.ws.close()
                break

    if not end:
        time.sleep(1)
        body = json.dumps({"text": "EXIT"})
        self.ws.send(body)
        time.sleep(1)
        self.ws.close()

class WebsiteUser(HttpUser):
    tasks = [UserBehavior]
    wait_time = constant(2)
    host = "ws://xx.xx.xx.xx:8080/websocket"

对于这个特定的测试,我将最大用户数设置为 1,将孵化率设置为 1,很明显,locust 继续每秒发送 1 个请求,如下面的响应所示:

[BOT]Response: {"text": "No, I don't have a netflix account. I do have a Hulu account, though.", "quick_replies": null}
enter code here
[BOT]Response: {"text": "I have not, but I would love to go. I have always wanted to visit the Philippines.", "quick_replies": null
[BOT]Response: {"text": "No, I don't have a netflix account. I do have a Hulu account, though.", "quick_replies": null}
[BOT]Response: {"text": "I think it's going to be New Orleans. _POTENTIALLY_UNSAFE__", "quick_replies": null}

我的期望是在我将最大用户数设置为 1 并且孵化率为 1 之后,将立即有 1 个 websocket 连接发送随机消息,并从 websocket 服务器接收 1 个主要响应。但发生的事情是它每秒重复 task 直到我明确按下蝗虫仪表板上的停止按钮。

我会调试你的逻辑。在每个 if 块中的不同位置和每个块之间放置更多 print 语句。在处理一长串决策时,很容易出错。

在这种情况下,您只想 sleep 在非常具体的情况下,但它没有发生。很可能你在意想不到的时候设置了 end = True,这样你就不会睡觉,并且会立即获得新用户。

编辑: 再次查看您的问题和问题描述,听起来您希望 Locust 发送一个请求,然后再也不发送另一个请求。这不是蝗虫的工作方式。 Locust 将 运行 你的任务代码用于某个用户。完成后,该用户离开并等待一定时间(看起来您已将其设置为 2 秒),然后生成另一个用户并重新开始任务。这个想法是它会尽量保持你告诉它的用户数量接近恒定。它不仅会运行 1000个用户然后结束测试,默认情况下。

如果要保留全部1000个用户运行ning,需要让他们继续执行代码。例如,您可以将任务中的所有内容放在另一个 while 循环中,并以另一种方式中断和结束。这样,即使在建立套接字连接并发送了您期望的单个消息之后,用户仍将处于循环中并且不会结束,因为它 运行 无事可做。这样做需要更多的工作和协调,但这是可能的。如果这不是您正在寻找的,那么可能还有其他关于不同方法的问题。