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
循环中,并以另一种方式中断和结束。这样,即使在建立套接字连接并发送了您期望的单个消息之后,用户仍将处于循环中并且不会结束,因为它 运行 无事可做。这样做需要更多的工作和协调,但这是可能的。如果这不是您正在寻找的,那么可能还有其他关于不同方法的问题。
我有一个测试用例,我需要生成 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
循环中,并以另一种方式中断和结束。这样,即使在建立套接字连接并发送了您期望的单个消息之后,用户仍将处于循环中并且不会结束,因为它 运行 无事可做。这样做需要更多的工作和协调,但这是可能的。如果这不是您正在寻找的,那么可能还有其他关于不同方法的问题。