#python #websocket #socket.io #load-testing #locust
#python #websocket #socket.io #нагрузочное тестирование #locust
Вопрос:
Я впервые пишу locustfile, и я пытаюсь реализовать нагрузочное тестирование websocket с помощью locust.
Я в основном скопировал и вставил этот пример кода из плагина locust, https://github.com/SvenskaSpel/locust-plugins/blob/5abac5852b0e09623bcdd90889d083df3288fead/examples/socketio_ex.py
но при отправке 2 (ping) возникает исключение WebsocketConnectionClosedException.(нет ответа при отправке 2)
Кроме того, я создаю ws-соединение с реальным сервером, и когда я отлаживаю полученные сообщения, он успешно печатает socketid. Однако журналы подключений не печатаются на стороне сервера. Я здесь в замешательстве. Он вообще устанавливает соединение? если нет, то как он может создать идентификатор сокета?
Еще один вопрос касается прослушивателя событий. Мой исходный клиент написан с помощью сокета.мы с io могли бы прослушивать конкретные события с помощью приведенного ниже кода. Поддерживает ли python такую функцию? Как реализовать прослушиватель событий в python?
socket.on("message", (data) => console.log(data))
Это мой locustfile
class MySocketIOUser(SocketIOUser):
@task
def my_task(self):
self.my_value = None
self.connect("wss://<server_url>/socket.io/?EIO=4amp;transport=websocket", [])
# example of subscribe
self.send('42["subscribe",{"url":"/namespace","sendInitialUpdate": true}]')
print('receive: ' self.ws.recv())
# wait until I get a push message to on_message
while not self.my_value:
time.sleep(0.1)
# wait for additional pushes, while occasionally sending heartbeats, like a real client would
self.sleep_with_heartbeat(10)
def on_message(self, message):
print('message: ' message)
self.my_value = message
if __name__ == "__main__":
host = "<client_host_url>"
сообщение об исключении приведено ниже
raise WebSocketConnectionClosedException(
websocket._exceptions.WebSocketConnectionClosedException: Connection to remote host was lost.
Мой клиент использует react, socket.io-client, а сервер использует nestjs с ws-gateway (socket.io )
Любая помощь приветствуется.
Ответ №1:
Вы не должны вызывать self.ws.recv() напрямую. Любые полученные сообщения будут генерировать вызов on_message(), обрабатывайте сообщение там.
Кроме того, что вы пытаетесь сделать с дополнительным []
параметром для connect() ?
SocketIOUser немного (очень) грубый по краям. Вы должны прочитать исходный код для получения дополнительных подсказок.
Комментарии:
1. Спасибо за ваш ответ! Я вызываю self.ws.recv() только для отладки полученных сообщений, и удаление этого фрагмента кода не решает проблему. вторым параметром connect() является заголовок, и я помещаю пустой массив, чтобы не указывать заголовок. Знаете ли вы, необходимо ли указывать массив заголовков в моем случае?
2. Ага. Я не знаю о заголовках (проверьте, что делает ваш браузер), я думаю, это зависит от вашей реализации. Если для отображения вашего сообщения требуется много времени, вам следует использовать self.sleep_with_heartbeat() вместо просто time.sleep(), чтобы убедиться, что соединение работает (вы можете получить упомянутое вами исключение, если сервер отправляет соединение слишком долго)