python3 上带有烧瓶的 websockets 当前可用的最佳选项

Best option currently available for websockets with flask on python3

目前我看到以下库可用于将 websockets 与 flask 一起使用:

  1. flask-sockets(可能已过时)
  2. flask-SocketIO
  3. gevent-websockets(以上2依此而定)

However gevent-websockets is not yet python3 compatible(atleast it is not install-able via pip). Which makes the other 2 unusable as well.

对于将 websockets 与 flask 一起使用,还有其他选择吗?还是龙卷风是最好的选择?

首先,请注意 Flask-SocketIO 与其他两个不同。它包装了 Socket.IO 协议,而不是原始的 WebSocket。这使它能够为不支持 WebSocket 协议的客户端支持使用 HTTP 长轮询模拟的类似 WebSocket 的接口。

说到 Flask-SocketIO,请注意此扩展即将进行大修。

目前正式版(0.6)依赖gevent、gevent-socketio和gevent-websocket。不幸的是,作为一个项目的 gevent-socketio 早已死去,并且停留在一个非常旧版本的 Socket.IO 协议上,这迫使你使用一个古老的 Javascript 客户端。

即将发布的 Flask-SocketIO 版本 1.0 是一个完全重写的版本,主要与 0.6 版本兼容,但它支持 Python 2 和 Python 3,并且采用允许不同的设计用于网络和并发的机制。 0.6 版的 gevent-socketio 依赖被两个名为 python-socketio and python-engineio 的新包取代,它们实现了当前版本的 Socket.IO 协议,并支持所有官方 Socket.IO 客户端(Javascript、Swift 和 C++)。

就低级依赖而言,基本上有三种选择:

  1. Eventlet

    Eventlet 是迄今为止 Py2 和 Py3 上性能最高和最稳定的选项。 WebSocket 支持是 eventlet 的原生支持,因此只需在您的 virtualenv 中安装 eventlet 即可使 Flask-SocketIO 以最佳配置工作。

  2. gevent 和 gevent-websocket

    如果出于某种原因您更喜欢 gevent,那也可以,但在我的测试中,它的性能不如 eventlet。如果你想在使用 gevent 时访问 WebSocket,那么你还需要安装包 gevent-websocket。 gevent 和 gevent-websocket 都已移植到 Python 3,但都太新了。

  3. Werkzeug(或任何其他多线程 WSGI 兼容服务器)

    您也可以使用 Flask 自带的网络服务器。在此模式下,扩展仅在长轮询模式下工作。与其他两个相比,性能显然很糟糕,但是对于开发和调试来说,能够让一切正常工作而不必 运行 eventlet 或 gevent,以及它们带来的所有复杂性是很好的。

截至今天(2015 年 10 月 4 日),新的 Flask-SocketIO 扩展已经发布了功能齐全的测试版。正式版本即将发布。您可以安装测试版:

pip install flask-socketio==1.0b1

代码在 git 存储库的 1.0 分支上可用:https://github.com/miguelgrinberg/Flask-SocketIO/tree/v1.0

免责声明:我相信现在这已经很清楚了,但为了以防万一,请注意我是 Flask-SocketIO、python-socketio 和 python-engineio 的作者。