【问题标题】:Production Flask-SocketIO + ZeroRPC生产 Flask-SocketIO + ZeroRPC
【发布时间】: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部署生产服务器的正确方法是什么?

【问题讨论】:

标签: python flask wsgi zerorpc


【解决方案1】:

我已经解决了这个问题,在调试时我选择“线程”作为异步模式

 socketio = SocketIO(app, async_mode="threading")

当使用 gunicorn 部署时,我使用 gevent

CMD ["gunicorn", "-w", "1", "-k", "gevent","--reload", "web_app:app"]

由于某种原因,gevent 不能在没有 gunicorn 的情况下工作,而 eventlet 不能和 zerorpc 一起工作..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 2012-11-13
    • 2018-06-18
    • 1970-01-01
    • 2018-08-21
    • 2020-04-05
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多