Celery - 在特定时间开始安排周期性任务

6
什么是在特定日期时间开始调度定期任务的最佳方法?
(我不使用cron来考虑到我需要安排约一百次远程rsync,我需要计算远程与本地偏移量,并且需要在每个主机中生成日志的第二秒同步每个路径。)
据我了解,celery.task.schedules crontab类只允许指定小时,分钟和星期几。到目前为止我发现的最有用的提示是nosklo的这个答案
这是最好的解决方案吗?我在使用错误的工具吗?
2个回答

12

Celery似乎是解决您调度问题的好方法:Celery的PeriodicTasks具有以秒为单位的运行时间分辨率。

您正在使用适当的工具,但crontab条目并不是您想要的。 您想使用Python的datetime.timedelta对象; celery.schedules中的crontab调度程序仅具有分钟分辨率,但使用timedelta来配置PeriodicTask间隔在本例中提供了严格更多的功能,即每秒分辨率。

例如,从Celery文档中

>>> 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)
这里唯一的挑战是你需要描述任务运行的频率而不是想要它运行的时钟时间;但是,我建议你查看高级Python调度器 http://packages.python.org/APScheduler/
看起来高级Python调度程序可以使用自己的调度功能轻松地启动普通(即非周期性)Celery任务,以便在您选择的任何时间表上运行。

谢谢bakennedy。我正在使用APScheduler,只是想检查一下Celery,看看能否改进我的当前系统。我已经阅读了PeriodicTask页面,但它虽然允许指定任务频率,但并没有指定何时开始。 - Joao Figueiredo
我的当前设置:一个守护进程的 APScheduler,从 .cfg 文件中读取将要启动的任务(start_time、frequency、process_to_call)。问题是,每当任务发生任何变化时(本地服务器和远程日志生成之间的偏移量现在不同;我需要不同的频率;进程参数已更改),我必须 SIGKILL 守护进程,因为 APScheduler ShelveJobStore 只允许从主循环进行更新(并且不会重新加载文件 ShelveJobStore),这违背了守护进程的目的。 - Joao Figueiredo
啊,我曾经误解了APScheduler,认为它只是一个定时库,用于在某个程序内计划延迟执行任务,而不是一个调度守护进程和作业管理系统。与celery相比,重叠的部分比我想象的要多得多;然而,celery仍然是一种更优秀的任务管理工具,特别是如果您的作业足够大,需要在单独的工作节点之间进行分布。 - bakennedy
PeriodicTask 似乎已经被弃用。 - Alper
@alper 你有更多关于那个的信息吗? - jeverling

-1

我最近处理了一个涉及Celery的任务,我不得不使用它进行异步操作和定时任务。可以说,对于定时任务,我回到了旧的crontab,尽管它调用了一个生成单独异步任务的Python脚本。这样做的好处是我只需要维护较少的crontab(要使Celery调度程序运行还需要进一步设置),但我充分利用了Celery的异步能力。


3
如果您已经在运行Celery,为什么不使用beat并使用crontab调度来运行它呢? - Alper

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