#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
, как только я получал около дюжины.