gunicorn and/or celery:什么是两全其美的方法?
gunicorn and/or celery: What is the way get the best out of both?
我有一个 机器学习 应用程序,它使用 flask 公开 api(对于生产来说这不是一个好主意想法,但即使我将来使用 django 问题的想法也不应该改变。
主要问题 是如何为我的应用提供多个请求。几个月前添加了 celery
来解决这个问题。 celery
中产生的工人数等于机器中存在的核心数。对于极少数用户来说,这看起来不错并且已经投入生产了一段时间。
当并发用户数增加时,显然我们应该对其进行性能测试。事实证明:它能够处理 30 GB 和 8 核 机器的 20 个用户,无需身份验证且无需任何前端。这看起来不是一个好数字。
我不知道有这样的东西:应用程序服务器、网络服务器、模型服务器。谷歌搜索此问题时:gunicorn
是一个很好的应用程序服务器 python 应用程序。
- 我应该使用
gunicorn
还是任何其他应用程序服务器以及 celery
以及为什么
- 如果我删除
celery
并且仅将 gunicorn
与应用程序一起使用,我可以实现并发。我读过某处 celery
不适合 机器学习 应用程序。
gunicorn
和 celery
的目的是什么。我们如何才能兼顾两者。
注意:主要目标是最大化并发性。在生产身份验证服务时将添加。一个前端应用程序可能会在生产过程中发挥作用。
瓶中无耻。如果实际上你只需要一个网络 API 包装器,flask
可能是比 django
更好的选择(仅仅是因为 django
很大,你只需要使用一个其能力的一小部分)。
但是,您的并发问题显然源于您对每个请求都进行了一些繁重的处理。根本没有办法解决这个问题;如果每个请求都需要一定数量的计算资源,则无法将其变魔术。从此就是杂耍了。
如果您希望立即得到有保证的响应,您需要拥有与潜在的同时请求一样多的工作人员。如果您不能在一台服务器上收集足够的资源,这可能涉及多台服务器的负载平衡。 (cuegunicorn
,一个web应用服务器,负责接受连接,然后分发给多个应用进程。)
如果您不介意没有立即得到回复,您可以让内容排队。 (提示 celery
,一个任务队列,工作进程可以使用它来检索接下来要做的事情,并存放结果)。如果您不需要在同一个请求-响应周期中进行响应,则此方法效果最佳;例如你从客户那里提交了一份工作,他们只得到一份工作已收到的确认;您将需要第二个请求来询问作业的状态,以及作业完成后可能的结果。
或者,您可以使用 websockets
或 Tornado 代替 Flask,在可用时将响应推送给客户端(与用户轮询结果或等待实时 HTTP 连接并占用服务器进程)。
我有一个 机器学习 应用程序,它使用 flask 公开 api(对于生产来说这不是一个好主意想法,但即使我将来使用 django 问题的想法也不应该改变。
主要问题 是如何为我的应用提供多个请求。几个月前添加了 celery
来解决这个问题。 celery
中产生的工人数等于机器中存在的核心数。对于极少数用户来说,这看起来不错并且已经投入生产了一段时间。
当并发用户数增加时,显然我们应该对其进行性能测试。事实证明:它能够处理 30 GB 和 8 核 机器的 20 个用户,无需身份验证且无需任何前端。这看起来不是一个好数字。
我不知道有这样的东西:应用程序服务器、网络服务器、模型服务器。谷歌搜索此问题时:gunicorn
是一个很好的应用程序服务器 python 应用程序。
- 我应该使用
gunicorn
还是任何其他应用程序服务器以及celery
以及为什么 - 如果我删除
celery
并且仅将gunicorn
与应用程序一起使用,我可以实现并发。我读过某处celery
不适合 机器学习 应用程序。 gunicorn
和celery
的目的是什么。我们如何才能兼顾两者。
注意:主要目标是最大化并发性。在生产身份验证服务时将添加。一个前端应用程序可能会在生产过程中发挥作用。
瓶中无耻。如果实际上你只需要一个网络 API 包装器,flask
可能是比 django
更好的选择(仅仅是因为 django
很大,你只需要使用一个其能力的一小部分)。
但是,您的并发问题显然源于您对每个请求都进行了一些繁重的处理。根本没有办法解决这个问题;如果每个请求都需要一定数量的计算资源,则无法将其变魔术。从此就是杂耍了。
如果您希望立即得到有保证的响应,您需要拥有与潜在的同时请求一样多的工作人员。如果您不能在一台服务器上收集足够的资源,这可能涉及多台服务器的负载平衡。 (cue
gunicorn
,一个web应用服务器,负责接受连接,然后分发给多个应用进程。)如果您不介意没有立即得到回复,您可以让内容排队。 (提示
celery
,一个任务队列,工作进程可以使用它来检索接下来要做的事情,并存放结果)。如果您不需要在同一个请求-响应周期中进行响应,则此方法效果最佳;例如你从客户那里提交了一份工作,他们只得到一份工作已收到的确认;您将需要第二个请求来询问作业的状态,以及作业完成后可能的结果。或者,您可以使用
websockets
或 Tornado 代替 Flask,在可用时将响应推送给客户端(与用户轮询结果或等待实时 HTTP 连接并占用服务器进程)。