【问题标题】:Can celery's beat tasks execute at timed intervals?celery 的节拍任务可以定时执行吗?
【发布时间】:2014-11-15 08:09:38
【问题描述】:

这是节拍任务设置:

celery_app.conf.update(
CELERYBEAT_SCHEDULE = {
'taskA': {
    'task': 'crawlerapp.tasks.manual_crawler_update',
    'schedule': timedelta(seconds=3600),
},
'taskB': {
    'task': 'crawlerapp.tasks.auto_crawler_update_day',
    'schedule': timedelta(seconds=3600),
},
'taskC': {
    'task': 'crawlerapp.tasks.auto_crawler_update_hour',
    'schedule': timedelta(seconds=3600),
},
})

通常在我的命令celery -A myproj beat 之后,taskA、taskB、taskC 作为节拍任务同时执行。但是现在我希望任务A首先执行,然后一段时间后任务B执行第二次,任务C最后执行。3600秒后他们再次执行。3600秒后他们再次执行。3600秒后他们再次执行。有可能吗?

【问题讨论】:

    标签: celery


    【解决方案1】:

    是的,这是可能的。为所有三个任务创建一个链,然后使用这个链式任务进行调度。

    在您的tasks.py 文件中:

    from celery import chain
    chained_task = chain(taskA, taskB, taskC)
    

    然后安排chained_task:

    celery_app.conf.update(
    CELERYBEAT_SCHEDULE = {
    'chained_task': {
        'task': 'crawlerapp.tasks.manual_crawler_update',
        'schedule': timedelta(seconds=3600),
    },  
    })
    

    这样,您的任务将在 3600 秒内按顺序执行一次。

    【讨论】:

    • 但是我有3个任务函数:manual_crawler_update、auto_crawler_update_day、auto_crawler_update_hour。你的意思是这3个任务是taskA taskB taskC??
    • 是的,这三个任务可以是任何东西,只要它们有任务装饰器。
    • 你好,我能再问你一个问题吗celery 一起 beat 任务,然后在我修改 bug 后一起启动 beat 任务。
    • 我认为这不可能,因为第一个任务的结果可能会影响下一个任务。结帐stackoverflow.com/questions/17461374/…
    • 忽略链条。我只有 3 个任务。它们不在链条中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多