Ошибка ключа Python SocketIO: «Сеанс отключен»

#python #flask #socket.io #python-socketio

Вопрос:

На небольшом веб-сервере Flask, работающем на RaspberryPi с примерно 10-20 клиентами, мы периодически получаем эту ошибку:

 Error on request: Traceback (most recent call last):  File "/home/pi/3D_printer_control/env/lib/python3.7/site-packages/werkzeug/serving.py", line 270, in run_wsgi  execute(self.server.app)  File "/home/pi/3D_printer_control/env/lib/python3.7/site-packages/werkzeug/serving.py", line 258, in execute  application_iter = app(environ, start_response)  File "/home/pi/3D_printer_control/env/lib/python3.7/site-packages/flask/app.py", line 2309, in __call__  return self.wsgi_app(environ, start_response)  File "/home/pi/3D_printer_control/env/lib/python3.7/site-packages/flask_socketio/__init__.py", line 43, in __call__  start_response)  File "/home/pi/3D_printer_control/env/lib/python3.7/site-packages/engineio/middleware.py", line 47, in __call__  return self.engineio_app.handle_request(environ, start_response)  File "/home/pi/3D_printer_control/env/lib/python3.7/site-packages/socketio/server.py", line 360, in handle_request  return self.eio.handle_request(environ, start_response)  File "/home/pi/3D_printer_control/env/lib/python3.7/site-packages/engineio/server.py", line 291, in handle_request  socket = self._get_socket(sid)  File "/home/pi/3D_printer_control/env/lib/python3.7/site-packages/engineio/server.py", line 427, in _get_socket  raise KeyError('Session is disconnected') KeyError: 'Session is disconnected'   

Ошибка генерируется автоматически изнутри python-socketio . Что на самом деле означает эта ошибка и как я могу ее предотвратить или подавить?

Ответ №1:

Насколько я могу судить, обычно это означает, что сервер не может поддерживать передачу данных всем клиентам.

Некоторые возможные методы смягчения последствий включают отключение неактивных клиентов, сокращение объема отправляемых данных, где это возможно, отправку оперативных данных большими порциями или обновление сервера. Если вам нужна большая пропускная способность данных, может быть также лучший вариант, чем socketIO .

Я смог воспроизвести его, установив действительно высокую скорость пинга и низкий тайм-аут в socketIO конструкторе:

 from flask_socketio import SocketIO  socketio = SocketIO(engineio_logger=True, ping_timeout=5, ping_interval=5)  

Это означает, что серверу приходится отправлять много сообщений всем клиентам, и у них не так много времени, чтобы ответить. Затем я открываю около 10 клиентов и начинаю видеть KeyError .

Дальнейшая отладка нашего сервера обнаружила процесс, который публиковал много живых данных, которые нормально работали только с несколькими клиентами, но время от времени начинали выдавать KeyError , как только я получал около дюжины.