生产 Flask-SocketIO + ZeroRPC

问题描述

我已经部署了一个flask-socketio网络服务器,但是在安装了安装gevent的zerorpc之后我遇到了很多麻烦.. 起初我的代码是这样的:

   File "remove_noise.py",line 66,in create_processed_dataset
    sent_tokens = [token.lemma_().lower().strip() for token in sent_w if token.pos_ == "ADJ" or token.pos_ == "NOUN" or token.pos_ == "ADV" or token.pos_ == "VERB" or token.pos_ == "ADP"]
  File "remove_noise.py",in <listcomp>
    sent_tokens = [token.lemma_().lower().strip() for token in sent_w if token.pos_ == "ADJ" or token.pos_ == "NOUN" or token.pos_ == "ADV" or token.pos_ == "VERB" or token.pos_ == "ADP"]
TypeError: 'str' object is not callable




我正在启动一个后台任务,该任务将不断从队列中读取并通过 socketio 发送消息。现在安装了 gevent,flask-socketio 将尝试使用它(实际上我可以将我的服务器设为生产服务器而不是开发服务器),但随后 socketio.start_background_task 会阻塞。所以我读了

socketio.start_background_task(poll_events)
socketio.run(app,host="0.0.0.0",keyfile='key.pem',certfile='cert.pem')

是必需的。 所以现在我的代码看起来像这样:

from gevent import monkey; monkey.patch_all()

出于某种原因,在使用 pycharm 进行调试时,我收到了很多奇怪的 greenlet 异常,而且我认为有时 socketio 消息会被丢弃,因此我决定使用 eventlet。再说一次,需要打补丁。所以我的代码看起来像这样:

socketio.start_background_task(poll_events)
WsgiServer(('0.0.0.0',5000),app,certfile='cert.pem').serve_forever()

因为猴子补丁 zerorpc 抛出异常 “gevent.exceptions.LoopExit:此操作将永远阻塞”

用flask + socketio + zerorpc部署生产服务器的正确方法是什么?

解决方法

我已经解决了这个问题,调试时我选择了“线程”作为 async_mode

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

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

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

出于某种原因,如果没有 gunicorn,gevent 将无法工作,而 eventlet 将无法与 zerorpc 一起工作..