金枪鱼和/或芹菜:如何从两者中获得最大收益?

Abh*_*sek 2 python concurrency celery gunicorn

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

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

当并发用户数量增加时,很明显,我们应该对其进行性能测试。事实证明:它可以处理20 GB30 GB用户和8核计算机,而无需身份验证和任何前端。这看起来不是一个好数字。

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

  • 我应该使用gunicorn或任何其他应用程序服务器以及celery原因
  • 如果删除celery并仅gunicorn与应用程序一起使用,则可以实现并发。我读过某个地方celery机器学习应用程序不利。
  • gunicorn和的目的是什么celery。我们如何才能做到两者兼得。

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

Ama*_*dan 5

烧瓶中没有污物。如果实际上您只需要一个Web API包装器,那flask可能是一个比django(更好的选择)更好的选择(这django是因为它非常庞大,并且您仅会使用它的一部分功能)。

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

  • 如果您希望立即得到保证的响应,则需要与潜在的同时请求数量一样多的工作人员。如果您无法在一台服务器上增加足够的资源,则可能涉及在多台服务器上进行负载平衡。(cue gunicorn是一个Web应用程序服务器,负责接受连接,然后将其分配给多个应用程序进程。)

  • 如果您可以不立即得到答复,可以放一些东西。(提示celery,任务队列,工作进程可以使用该队列来检索要完成的下一件事情,并存储结果)。如果您在同一请求-响应周期中不需要响应,则此方法效果最好。例如,您从客户那里提交了一份工作,而他们仅得到已收到该工作的确认;您将需要第二个请求来询问作业的状态,以及如果作业完成的话可能的结果。

  • 或者,可以使用Flas websockets或Tornado 代替Flask 来将响应推送到客户端(与用户轮询结果相反,或者等待实时HTTP连接并占用服务器进程)。