【问题标题】:gunicorn and/or celery: What is the way get the best out of both?gunicorn 和/或 celery:怎样才能充分利用两者?
【发布时间】:2018-12-19 06:05:46
【问题描述】:

我有一个 机器学习 应用程序,它使用 flask 来公开 api(对于生产来说这不是一个好主意,但即使我会使用 django 以后这个问题的想法不应该改变)。

主要问题是如何为我的应用提供多个请求。几个月前添加了celery 来解决这个问题。 celery 中产生的工人数量等于机器中存在的核心数量。对于极少数用户来说,这看起来不错,并且已经投入生产了一段时间。

当并发用户数增加时,很明显我们应该对其进行性能测试。事实证明:它能够为 30 GB8 核 机器处理 20 个用户,无需身份验证且无需任何前端。这看起来不是一个好数字。

我不知道有这样的东西:应用程序服务器、Web 服务器、模型服务器。当谷歌搜索这个问题时:gunicorn 是一个很好的应用服务器 python 应用程序。

  • 我应该使用gunicorn 或任何其他应用程序服务器以及celery 以及为什么
  • 如果我删除celery 并且只在应用程序中使用gunicorn 可以实现并发。我在某处读过 celery 不适合 机器学习 应用程序。
  • gunicorncelery 的用途是什么。我们如何才能实现两者的最佳结合。

注意:主要目标是最大化并发性。在生产中服务时,将添加身份验证。一个前端应用程序可能会在生产中发挥作用。

【问题讨论】:

  • 为什么在生产环境中使用 Flask 公开 API 不是一个好主意?
  • “Flask 的 内置服务器 不适合生产”(强调我的) - 不是“Flask 不适合生产”。那里有区别。整个页面的其余部分专门用于推荐的不同设置。
  • @Abhisek 所以使用不同的服务器和烧瓶...

标签: python concurrency celery gunicorn


【解决方案1】:

烧瓶里没有羞耻感。如果实际上您只需要一个 Web API 包装器,flask 可能是比django 更好的选择(因为django 很大,您只需要使用它的一小部分功能)。

但是,您的并发问题显然源于您正在为每个请求进行一些繁重的处理这一事实。根本没有办法解决这个问题。如果您每个请求都需要一定数量的计算资源,那么您就无法使用这些资源。从这里开始,这是一个杂耍表演。

  • 如果您想要立即得到有保证的响应,您需要与潜在的同时请求一样多的工作人员。如果您无法在一台服务器上收集足够的资源,这可能涉及多台服务器上的负载平衡。 (提示gunicorn,一个Web应用服务器,负责接受连接,然后将它们分发给多个应用进程。)

  • 如果您可以接受没有立即响应,您可以让事情排队。 (提示celery,一个任务队列,工作进程可以使用它来检索下一件要完成的事情,并存放结果)。如果您在同一个请求-响应周期中不需要响应,这种方法效果最好;例如您从客户那里提交了一份工作,他们只会收到一份工作已收到的确认;您将需要第二次请求来询问作业的状态,以及作业完成后的结果。

  • 或者,您可以使用websockets 或 Tornado 代替 Flask,在客户端可用时将响应推送到客户端(而不是用户轮询结果,或等待实时 HTTP 连接并获取启动服务器进程)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多