Веб-сокеты с Python - различные варианты - PullRequest
0 голосов
/ 17 мая 2019

Я прочитал о библиотеке веб-сокетов Python , и она действительно сработала для меня. Особенно меня порадовал стандартный способ подключения из веб-клиента:

var ws = new WebSocket("ws://127.0.0.1:5678/")
ws.onmessage = function (event) ...

Нет импорта, все стандартно и поддерживается современными браузерами из коробки. Пока все хорошо, но Python-приложение - это Flask с Connexion для REST API на основе swagger.yaml. Библиотека Websockets не может использовать один и тот же порт с Flask / Connexion. Хорошо, есть библиотека Flask-socketio , которую я смог запустить с Connexion и сервером как REST, так и Websockets. Но для меня это имеет несколько недостатков, и я прошу вашей помощи:

  1. На клиенте я вынужден использовать socketio, так как WebSocket с поддержкой браузера не будет работать с Flask-socketio. Это всегда так, или я делаю что-то не так (это связано с вопросом 2).
  2. До сих пор я успешно запускал Flask-socketio в режиме отладки Flask (python my_flask_source.py). Я прочитал документацию Flask-socketio и понял, что этот режим не поддерживает веб-сокеты, только длительный опрос. Действительно, я вижу много запросов GET / POST, которые приходят каждые несколько секунд и обслуживаются Flask. Заказчик использует uWSGI для производства, однако мне не очень понятно, с чего начать воспроизводить его конфигурацию в процессе разработки. Я довольно новичок в Python, но, прочитав как можно больше соответствующих источников, я понял, что сервер разработки Flask является многопоточным, то есть он может обслуживать множество параллельных запросов в одном процессе. Но похоже, что uWSGI является однопоточным, и для достижения высокой пропускной способности приходится порождать множество процессов. Также есть модуль gevent:

uwsgi --http: 5000 --gevent 1000 --http-websockets --master --wsgi-файл app.py - callable app

Есть ли хорошо написанные пошаговые инструкции по развертыванию сервера Flask-socketio под uWSGI для производства? Nginx входит в игру? Смогу ли я использовать веб-сокеты в браузере или все-таки socketio?

1 Ответ

1 голос
/ 17 мая 2019

Позвольте мне попытаться уточнить:

  1. Если вы используете сервер Socket.IO, вы должны использовать клиент Socket.IO. Socket.IO - это не то же самое, что WebSocket.

  2. Вы запускаете uWSGI с Gevent, поэтому параллелизм обрабатывается с помощью гринлетов. Аргумент --gevent 1000 настраивает 1000 одновременных задач. Вам не нужно запускать несколько процессов uWSGI, если у вас не закончились эти 1000.

Есть ли хорошо написанные пошаговые инструкции по развертыванию сервера Flask-socketio под uWSGI для производства?

Все, что я могу предложить - это документация Flask-SocketIO и python-socketio.

Входит ли nginx в игру?

На самом деле, до вас. Сервер uWSGI готов к работе, но довольно часто его помещают за nginx, а nginx завершает TLS, обслуживает статический контент и т. Д.

Смогу ли я использовать веб-сокеты в браузере или все-таки socketio?

Неа. Смотри выше.

...