【问题标题】:Handle concurrent requests or threading Flask SocketIO with eventlet使用 eventlet 处理并发请求或线程化 Flask SocketIO
【发布时间】:2018-07-14 15:37:55
【问题描述】:

我已经开始大量使用 Python 中的 Flask SocketIO 和 Eventlet,并且正在寻找一种解决方案来处理并发请求/线程。我已经看到使用 gevent 是可以的,但是如果我使用 eventlet 怎么办呢?

【问题讨论】:

  • 我认为你应该看看flask的部署工具,比如gunicorn。在flask-socketio 文档页面flask-socketio.readthedocs.io/en/latest 中有关于这个问题的更多信息你可以在那里设置一些工作人员以实现并发

标签: python socket.io webserver flask-socketio eventlet


【解决方案1】:

eventlet web 服务器通过greenlets 支持并发,和gevent 一样。无需您做任何事情,始终启用并发。

【讨论】:

  • 谢谢米格尔,很高兴知道。虽然,您认为除了 eventlet 作为工作程序之外,应用程序是否会以某种方式受益于使用 gunicorn ? eventlet 是否支持并行性?
  • 我不会说有好处。 Eventlet 带有一个基于 greenlet 的 WSGI 服务器和 gunicorn。您可以将其中任何一个与 Flask-SocketIO 一起使用。 Eventlet 和 gevent 一样,在单线程中运行并使用协作多任务。
【解决方案2】:

您可以使用gunicorn 或其类似物在生产模式下启动应用程序,并由多个工人组成。 正如here所说:

gunicorn --worker-class eventlet -w 5 module:app

-w 后面的数字是工作人员的数量,module 是您的 flask-socketio 服务器模块,app 是烧瓶应用程序 (app = flask.Flask(__name__))。每个工作人员都是忙于处理传入请求的进程,因此您将具有并发性。如果您的应用执行的任务需要大量时间,则执行该任务的工作人员在执行该任务时将反应迟钝。

注意:如果你以这种方式启动你的应用程序,if __name__ == '__main__': 部分将被忽略,似乎你的模块将被导入。在这种情况下,您不需要在模块中自己调用app.run

【讨论】:

  • 我对此表示反对,因为它不正确。 gunicorn 不能使用多个工人,因为它缺乏“粘性会话”支持。 Socket.IO 协议需要粘性会话才能与多个工作人员一起工作。 documentation 涵盖了 Flask-SocketIO 应用程序的有效部署方法。
猜你喜欢
  • 2016-04-15
  • 2016-07-22
  • 2021-07-24
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2016-11-05
相关资源
最近更新 更多