Python 在指定时间在Django芹菜中运行任务?
my tasks.py文件中的代码段如下所示: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触发
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()
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感谢您指出这一点!根据您的建议更新了答案。