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


问题内容

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

(考虑到我需要安排大约一百个远程rsync,因此我没有使用cron,我在其中计算远程vs本地偏移量,并且需要在每个主机中生成日志的 第二秒
对每个路径进行rsync 。)

据我了解,celery.task.schedules
crontab类仅允许指定小时,分钟,星期几。到目前为止,我发现的最有用的提示是nosklo的答案

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


问题答案:

Celery似乎是解决日程安排问题的好方法:Celery的PeriodicTasks具有几秒钟的运行时间解析。

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

例如来自芹菜文档

>>> 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任务。