Как я могу одновременно использовать транспорт Websocket и async_mode = threading в flask-socketio? - PullRequest
0 голосов
/ 15 мая 2019

Я настраиваю сервер socket.io, и у нас есть несколько фоновых потоков, которые вызывают long, блокируя методы, которые опрашивают данные. Мы также хотим отправить данные клиенту socket.io из этих потоков. Мы столкнулись с проблемами, когда эти потоки что-то испускали, и потребовалось бы целую вечность, чтобы это было передано клиентам, пока мы не переключились на async_mode = 'threading'. Тогда все работало отлично, за исключением того, что теперь мы получаем предупреждение:

Транспорт WebSocket недоступен. Установите eventlet или gevent и gevent-websocket для повышения производительности.

Эти модули установлены, но не используются при использовании режима потоков. Как у нас могут быть оба фоновых потока, которые всегда работают и не вызывают socketio.sleep, в то же время используя транспорт Websocket вместо потоков? Спасибо

1 Ответ

0 голосов
/ 16 мая 2019

Я являюсь автором Flask-SocketIO и сервера Socket.IO, на котором он построен.

Краткий ответ: вам нужен кто-то, чтобы добавить автономную поддержку WebSocket в пакет python-engineio, одна из основных зависимостей Flask-SocketIO.

Вот длинный ответ.Сервер WebSocket, основанный на стандартных потоках, вообще плохая идея, поэтому я никогда не реализовывал его сам.Серверы WebSocket очень требовательны, потому что они требуют постоянного соединения с каждым клиентом.Если у вас есть 100 подключенных клиентов, то вам нужно 100 активных подключений.На многопоточном сервере это означает, что вам нужно 100 потоков, работающих одновременно и потенциально долгое время.К сожалению, количество потоков, которые вы можете иметь в процессе Python, несколько ограничено.Вы можете иметь 100, но 1000 может быть проблемой.Практически во всех реализациях WebSocket используются асинхронные серверы, потому что серверы этого типа могут легко поддерживать большое количество активных соединений.

Надеюсь, это дает вам обоснование того, почему я никогда не реализовывал WebSocket для потоков.С учетом вышесказанного, для серверов с низким числом клиентов поток на каждого клиента может быть нормальным, поэтому я готов добавить эту функцию, если кто-то решит внедрить ее и внести ее.

...