106

我无法理解“分布式任务队列”的目的。例如,python 的celery 库

我知道在 celery(python 框架)中,您可以为要执行的函数设置定时窗口。但是,这也可以在针对 python 脚本的 linux crontab 中轻松完成。

据我所知,从我自己的 django-celery webapps 中可以看出,celery 比仅仅设置一个原始的 crontab 消耗更多的 RAM 内存。相对较小的应用程序只有几百 MB 的差异。

有人可以帮我解决这个区别吗?也许对任务队列/ crontabs 的一般工作方式的高级解释也很好。

谢谢你。

4

1 回答 1

156

这取决于您希望您的任务做什么,是否需要分配它们,以及您希望如何管理它们。

crontab 能够每 N 个间隔执行一次脚本。它运行,然后返回。本质上,您每个间隔都会执行一次。您可以只指示 crontab 执行 django 管理命令并访问整个 django 环境,因此 celery 并不能真正帮助您。

celery 在消息队列的帮助下带来了分布式任务。许多服务器可以加入工作人员池,每个服务器都会收到一个工作项,而不必担心重复处理。也可以在准备就绪后立即执行任务。使用 cron,您被限制为至少一分钟。

例如,假设您刚刚启动了一个新的 Web 应用程序,并且您收到了数百个需要向每个用户发送电子邮件的注册。发送电子邮件可能需要很长时间(相对而言),因此您决定通过任务处理激活电子邮件。

如果您使用的是 cron,则需要确保每分钟 cron 都能够处理所有需要发送的电子邮件。如果您有多个服务器,您现在需要确保您没有向同一用户发送多封激活电子邮件 - 您需要某种同步。

使用 celery,您可以将任务添加到队列中。每台服务器可能有多个工作人员,因此您已经在 cronjob 之前进行了扩展。您可能还拥有多台服务器,可让您进行更多扩展。同步作为“队列”的一部分处理。

可以使用 celery 作为 cron 替代品,但这并不是它的主要用途。它用于跨分布式集群分出异步任务。

当然,celery 有很多cron 没有的特性。

于 2013-04-26T10:50:13.043 回答