考虑到Celery已经是运行任务队列的堆栈的一部分(即,它不是仅为运行cron而添加的,这似乎是一个过度的IMHO)。
作为crontab的替代品,它的"周期性任务"功能如何发挥作用?具体寻找以下几点。
- 相对于crontab的主要优点/缺点
- 芹菜比crontab更好选择的用例
- 特定于Django的用例:Celery vs crontab运行基于Django的周期性任务,此时Celery已作为
django-celery
包含在堆栈中,用于查询Django任务
我一直在为一个生产网站使用cron,并在当前项目中使用了celeni。我更喜欢芹菜而不是cron,原因如下:
- 芹菜+芹菜节拍的粒度比cron更细。Cron不能每分钟运行一次以上,而芹菜可以(我有一个任务每90秒运行一次,检查一个电子邮件队列以发送消息,另一个任务清理在线用户列表)
- cron行必须调用一个脚本或一个唯一的命令,其中包含绝对路径和用户信息。Celery调用python函数,只需编写代码即可
- 对于芹菜,要部署到另一台机器,通常只需要提取/复制代码,代码通常在一个地方。使用cron进行部署需要更多的工作(您可以将其自动化,但…)
- 我真的发现芹菜比cron更适合用于日常清理(缓存、数据库),而且通常用于短期任务。然而,转储数据库更像是cron的一项工作,因为您不想让太长的任务扰乱事件队列
- 更重要的是,Celery很容易在机器之间分布
Celery在您需要跨多台机器协调作业的任何时候都会被指示,确保即使在工作组中添加或删除机器时作业也能运行,能够设置作业的过期时间,用图形样式而不是线性依赖流定义多步作业,或者具有跨多个操作系统和版本操作相同的调度逻辑的单个存储库。