在指定时间在Django Celery中运行任务?

时间:2019-11-25 11:45:43

标签: python django celery scheduled-tasks

我的 tasks.py 文件中的

摘录如下:

from celery.task.schedules import crontab
from celery.decorators import periodic_task

@periodic_task(
    run_every=crontab(minute='15, 45', hour='0, 7, 15'),
)
def task1():
    send_mail()

我希望仅在 00:15 7:15 15触发 task1()中的脚本: 45 ,而在当前设置下,它是在 00:15 00:45 7:15 7:45 15:15 15:45

我该怎么做?另外,请告诉我是否有更好的方法!

2 个答案:

答案 0 :(得分:0)

您有两个选择。一种是多次定义修饰的函数:

def _task1():
    send_mail()

task1_a = @periodic_task(
    _task1,
    run_every=crontab(minute='15', hour='0, 7'),
)
task1_b = @periodic_task(
    _task1,
    run_every=crontab(minute='45', hour='15'),
)

另一种选择是定义实现celery's schedule interface的自定义时间表。

答案 1 :(得分:0)

通读了version,并借鉴了documentation的一些想法之后,我开始如下解决问题:

  1. 删除 periodic_task 装饰器并更新 tasks.py 为:

    from celery.task.schedules import crontab
    from celery.decorators import periodic_task
    
    @task
    def task1():
        send_mail()
    
  2. celery.py 中将节拍时间表添加为:

    app.conf.beat_schedule = {
        'alert': {
            'task': 'app.tasks.task1',
            'schedule': crontab(minute='15', hour='0, 7')
        },
        'custom_alert': {
            'task': 'app.tasks.task1',
            'schedule': crontab(minute='45', hour='15')
        }
    }
    

通过这些设置, task1()中的 script 仅在所需时间(0:15、7:15和15:45)被触发!