Python 的 Websockets - 各种选项

Websockets with Python - various options

我读过 Python websockets Library,它确实对我有用。我对从 Web 客户端连接的标准方式特别满意:

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

没有进口,一切都是标准的,开箱即用的现代浏览器支持。到目前为止一切顺利,但是 Python 应用程序是 Flask with Connexion for swagger.yaml-based REST API。 Websockets 库不能与 Flask/Connexion 共享同一个端口。好的,有 Flask-socketio 库,我可以 运行 使用 Connexion 和服务器 REST 和 Websockets。但对我来说它有几个缺点,我请求你的帮助:

  1. 在客户端,我不得不使用 socketio,因为浏览器支持的 WebSocket 不能与 Flask-socketio 一起使用。总是这样,还是我做错了什么(这与问题2有关)。
  2. 到目前为止,我在 Flask 调试模式下成功 运行ning Flask-socketio (python my_flask_source.py)。我已经阅读了 Flask-socketio 文档,了解到这种模式不支持 Websockets,只支持长轮询。事实上,我看到许多 GET/POST 请求每隔几秒就会出现一次,并由 Flask 提供服务。客户正在使用 uWSGI 进行生产,但是我不太清楚从哪里开始在开发中重现他们的配置。我是 Python 的新手,但通过阅读尽可能多的相关资源,我了解到 Flask 开发服务器是多线程的,这意味着它可以在单个进程中处理许多并行请求。但看起来 uWSGI 是单线程的,必须产生许多进程才能实现高吞吐量。此外,还有一些 gevent 模块:

uwsgi --http :5000 --gevent 1000 --http-websockets --master --wsgi-file app.py --callable app

是否有关于在 uWSGI 下部署 Flask-socketio 服务器用于生产的任何编写良好的分步说明? nginx 发挥作用了吗?我可以在浏览器中使用 Websockets 还是仍然使用 socketio?

让我试着澄清一下:

  1. 如果您使用 Socket.IO 服务器,则必须使用 Socket.IO 客户端。 Socket.IO与WebSocket不一样。

  2. 你是 运行 带有 gevent 的 uWSGI,所以并发是通过 greenlets 处理的。 --gevent 1000参数配置1000个并发任务。你不需要生成多个 uWSGI 进程,除非你 运行 out that 1000.

Is there any well-written step by step instruction of deploying Flask-socketio server under uWSGI for production?

我只能提供 Flask-SocketIO 和 python-socketio 文档。

Does nginx come into play?

真的,取决于你。 uWSGI 服务器是 production-ready,但将它放在 nginx 后面并让 nginx 终止 TLS、提供静态内容等是很常见的。

Will I be able to use Websockets in browser, or still socketio?

没有。见上文。