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 工人一起发射