【发布时间】:2021-08-31 12:47:56
【问题描述】:
我已经部署了一个 flask-socketio 网络服务器,但是在安装了安装 gevent 的 zerorpc 之后,我遇到了很多麻烦。 起初我的代码是这样的:
socketio.start_background_task(poll_events)
socketio.run(app, host="0.0.0.0", keyfile='key.pem', certfile='cert.pem')
我正在启动一个后台任务,该任务将不断地从队列中读取数据并通过 socketio 发送消息。现在 gevent 已安装,flask-socketio 将尝试使用它(我很高兴实际上将我的服务器设为生产服务器而不是开发服务器),但随后 socketio.start_background_task 块。所以我读到了
from gevent import monkey; monkey.patch_all()
是必需的。 所以现在我的代码看起来像这样:
socketio.start_background_task(poll_events)
WSGIServer(('0.0.0.0', 5000), app, keyfile='key.pem', certfile='cert.pem').serve_forever()
由于某种原因,在使用 pycharm 进行调试时,我收到了很多奇怪的 greenlet 异常,而且我认为有时 socketio 消息会被丢弃,所以我决定使用 eventlet。再说一次,需要打补丁。所以我的代码如下所示:
socketio.start_background_task(poll_events)
eventlet.wsgi.server(eventlet.wrap_ssl(eventlet.listen(("0.0.0.0", 5000)), keyfile='key.pem', certfile='cert.pem'), app)
因为猴子补丁 zerorpc 抛出异常 "gevent.exceptions.LoopExit: 这个操作会永远阻塞"
使用flask + socketio + zerorpc部署生产服务器的正确方法是什么?
【问题讨论】: