Python 在指定时间在Django芹菜中运行任务?

Python 在指定时间在Django芹菜中运行任务?,python,django,celery,scheduled-tasks,Python,Django,Celery,Scheduled Tasks,my 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() 我希望task1()中的脚本仅在00:15、7:15和15:45触发

my 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()
我希望task1()中的脚本仅在00:15、7:15和15:45触发,而在当前设置下,它在00:15、00:45、7:15、7:45、15:15和15:45触发


我该怎么做?另外,让我知道是否有更好的方法

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

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'),
)
另一个选项是定义一个自定义的实施时间表。

在阅读了并借鉴了一些想法后,我着手解决这个问题,如下所示:

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()
  • 删除定期任务装饰器并更新tasks.py 作为:

  • 将节拍表添加到芹菜.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()中的脚本仅在所需时间(0:15、7:15和15:45)触发

    你能多次使用装饰器来实现你想要的吗?@voodoo burger你是说多次使用同一装饰器(使用不同的参数)?那不行!!我认为我们不能给变量分配装饰器!我正在探索第二种方法,但你能详细说明第一种方法吗?是的,你能。Python是一种具有一流功能的语言。它们本身实际上就是目标。装饰器所做的就是包装内部函数。因此,与其两次定义内部函数或创建一个调用内部函数的新函数,不如两次使用decorator来包装函数,创建两个新函数。虽然我知道Python中有一流的函数,但我认为这样使用decorator是不可能的!对于给定的问题,第一种方法(将decorators分配给变量)抛出了一个语法错误。我认为您不必两次定义beat调度。否则,这是更好的解决方案。@schillingt感谢您指出这一点!根据您的建议更新了答案。