Flask-SocketIO 未使用 Gevent/Gevent-websocket

Posted

技术标签:

【中文标题】Flask-SocketIO 未使用 Gevent/Gevent-websocket【英文标题】:Gevent/Gevent-websocket not being used by Flask-SocketIO 【发布时间】:2018-12-22 03:37:00 【问题描述】:

我正在使用 Flask 和 Flask-SocketIO 构建一个 web 接口/数据 API,用于 websocket 通信。我想开始转向使用 Gevent/Gevent-websocket、Gunicorn 以及最终使用 nginx 进行负载平衡的更易于开发的设置。但是,在安装 Gevent 和 Gevent-websocket 后,我​​在启动 SocketIO 服务器时仍然收到警告消息:

WebSocket transport not available. Install eventlet or gevent and gevent-websocket for improved performance.

根据 Flask-SocketIO 文档,

当应用程序处于调试模式时,Werkzeug 开发服务器仍会在 socketio.run() 中正确使用和配置。在生产模式下,如果可用,则使用 eventlet Web 服务器,否则使用 gevent Web 服务器。如果未安装 eventlet 和 gevent,则使用 Werkzeug 开发 Web 服务器。

这意味着 Gevent 的使用应该作为 Flask-SocketIO 的一部分在幕后自动化。我使用 pip list 检查了我的 Python 安装,并确认我安装了 Gevent 1.3.4 和 Gevent-websocket 0.10.1。下面是 SocketIO 服务器的初始化代码:

app.py

flaskApp = Flask(__name__)
flaskApp.config['SESSION_TYPE'] = 'filesystem'
Session(flaskApp)
socketio = SocketIO(flaskApp, async_mode='threading', manage_session=False)

def createApp():
    flaskApp.secret_key = "super secret"
    socketio.run(flaskApp, host='0.0.0.0', port=80)

start.py

app.register_blueprint(monitor.blueprint)
...
createApp()

为什么 Flask-SocketIO 没有检测到我的 Gevent 安装?

【问题讨论】:

【参考方案1】:

您引用的文档部分指的是async_mode 参数,以及默认情况下它是如何设置的。您正在设置async_mode='threading',以便禁用异步模式的自动选择。删除参数,然后你会得到 eventlet 或 gevent,这取决于你安装了什么。

【讨论】:

以上是关于Flask-SocketIO 未使用 Gevent/Gevent-websocket的主要内容,如果未能解决你的问题,请参考以下文章

我无法安装 eventlet/gevent/greenlet

Flask-Socketio 应用程序在 Heroku 上出现超时错误

Nginx 和 Flask-socketio Websockets:活着但不是消息传递?

烧瓶-SocketIO + uWSGI。与 Mule 工人一起发射

Python - NameError:使用 gevent 时未定义名称“PROTOCOL_SSLv3”

gunicorn+gevent 怎么觉得未实现 flask 的真正并行