【问题标题】:Celery - schedule periodic tasks starting at a specific timeCelery - 安排从特定时间开始的定期任务
【发布时间】:2011-12-12 12:10:19
【问题描述】:

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

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

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

这是最好的解决方案吗? 我是否使用了错误的工具来完成这项工作?

【问题讨论】:

    标签: python celery scheduled-tasks


    【解决方案1】:

    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)
    

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

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

    【讨论】:

    • 谢谢贝克尼迪。我正在使用 APScheduler,只是在检查 Celery,看看我是否可以改进我当前的系统。我已经阅读了 PeriodicTask 页面,虽然它允许指定任务频率,但它没有指定 何时 它将开始。
    • 我当前的设置:一个守护进程的 APScheduler,它从 .cfg 文件中读取它将启动哪些任务(start_time、frequency、process_to_call)。问题是,每次任务发生任何变化时,我都必须 SIGKILL 守护进程(我的本地服务器和远程日志生成之间的偏移量现在不同;我需要不同的频率;进程参数已更改)看到 APScheduler ShelveJobStore 只允许从主循环更新(例如,不会重新加载文件 ShelveJobStore),这违背了守护进程的目的。
    • 啊,我误解了APScheduler,认为它只是一个定时库,用于从某个程序中调度延迟执行任务,而不是调度守护进程和作业管理系统。芹菜的重叠比我想象的要多。但是,celery 仍然绝对是一种出色的任务管理工具,尤其是当您的作业大到需要分布在不同的工作节点之间时。
    • PeriodicTask 似乎已被弃用。
    • @alper 你有更多相关信息吗?
    【解决方案2】:

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

    【讨论】:

    • 如果你仍然在运行 celery,为什么不使用 beat 运行它并使用 crontab 调度?
    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2010-12-31
    • 2017-09-25
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多