使用Celery运行定时任务相比于使用crontab有什么优势?

53

考虑到Celery已经是运行任务队列的堆栈的一部分(即它不仅仅是为了运行cron而添加,这似乎是过度设计),那么它的“周期性任务”功能如何作为crontab的替代品是有益的呢?具体来说,以下是需要考虑的几个方面。

  • 与crontab相比的主要优劣势
  • 使用Celery比crontab更好的场景
  • Django特定用例:在堆栈中包含django-celery以排队Django任务时,Celery与crontab的区别,以运行基于Django的定期任务。

2
对我来说最重要的是cron的环境变量往往与应用程序部署的其他部分(如WSGI应用服务器和Celery工作进程)有很大的差异。在Celery中使用定期任务可以避免许多路径和设置问题。但这完全取决于判断力:我的分析是针对主要基于Django的代码库和部署设置,但具有许多其他cron作业的多语言代码库可能认为cron环境比Django环境“更标准”。 - AdamKG
1
尽管不是详尽无遗的,但这个答案提供了一些很好的观点。而且通过Django管理界面更容易管理/控制任务,而不是登录服务器并手动编辑crontab。 - Sudipta
2个回答

57

我曾在一个生产网站中使用cron,但目前的项目已经转用celery。 我更喜欢celery而不是cron,原因如下:

  • Celery + Celerybeat比cron更细致。Cron不能运行超过一分钟以上,而celery可以(我有一个任务每90秒运行一次,检查电子邮件队列以发送消息,另一个任务则清理在线用户列表)。
  • Cron行需要调用脚本或唯一的命令,还需要绝对路径和用户信息。Celery调用python函数,无需编写其他代码。
  • 使用celery时,通常只需要拉取/复制你的代码,因为它通常在一个地方。使用cron部署需要更多工作(虽然可以自动化)。
  • 我真的发现celery比cron更适合例行清理(缓存、数据库),以及处理短时间的任务。将数据库转储更适合cron执行,因为您不希望过长的任务混乱事件队列。
  • Celery易于跨机器分布。

3
你可以在管理站点中随时添加和管理定期任务,无需连接到服务器控制台。 - panchicore
一些注意事项:需要频繁运行且不希望“重叠”的Cron任务应在不需要重叠时使用flock运行。对于这种情况,Celery任务应指定过期时间。服务器可能具有不同的默认时区,在设置cron时应考虑到这一点。可以通过CELERY_TIMEZONE在应用程序级别上配置Celery以使用特定的时区。Celery任务队列会消耗内存或磁盘空间:您应确保您的队列不会无限增长。“使用cron部署”可以在某种程度上自动化,使用run-parts即可。 - imposeren

5

Celery是一种工具,用于协调跨多台机器的作业,确保即使在工作组中添加或删除机器,作业也能运行,具有设置作业过期时间的功能,定义图形式而不是线性依赖流的多步作业,或者拥有单个调度逻辑存储库,可在多个操作系统和版本上运行相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接