芹菜 - 安排在特定时间开始的定期任务

时间:2011-10-21 11:02:57

标签: python celery scheduled-tasks

从特定日期时间开始安排定期任务的最佳方法是什么?

(考虑到我需要安排大约一百个远程rsyncs,我没有使用cron, 我在哪里计算远程与本地偏移量,并且需要rsync每条路径第二在每个主机中生成日志。)

根据我的理解,celery.task.schedules crontab类只允许指定小时,分钟,星期几。 到目前为止,我发现的最有用的提示是this answer by nosklo

这是最好的解决方案吗? 我使用了错误的工具吗?

2 个答案:

答案 0 :(得分:12)

Celery似乎是解决您的日程安排问题的好方法:Celery的PeriodicTasks在几秒钟内就可以运行时间分辨率。

您在这里使用的是合适的工具,但crontab条目并不是您想要的。你想使用python的datetime.timedelta对象; celery.schedules中的crontab调度程序只有很小的分辨率,但使用timedelta来配置PeriodicTask间隔提供了严格的更多功能,在这种情况下,每秒分辨率。

e.g。来自芹菜文档

>>> from celery.task import tasks, PeriodicTask
>>> from datetime import timedelta
>>> class EveryThirtySecondsTask(PeriodicTask):
...     run_every = timedelta(seconds=30)
...
...     def run(self, **kwargs):
...         logger = self.get_logger(**kwargs)
...         logger.info("Execute every 30 seconds")

http://ask.github.com/celery/reference/celery.task.base.html#celery.task.base.PeriodicTask

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

这里唯一的挑战是你必须描述你想要运行这个任务的频率,而不是你希望它运行的时钟;但是,我建议您查看Advanced Python Scheduler http://packages.python.org/APScheduler/

看起来Advanced Python Scheduler可以很容易地用于在你选择的任何时间表上使用它自己的调度功能启动正常(即非周期性)Celery任务。

答案 1 :(得分:-1)

我最近参与了一项涉及Celery的任务,我不得不将它用于异步操作以及计划任务。我只想说我使用旧的crontab来执行计划任务,尽管它调用了一个生成单独异步任务的python脚本。这样我对crontab的维护就更少了(为了让Celery调度程序在那里运行需要进一步设置),但我正在充分利用Celery的异步功能。