我能够创建celery_beat_schedule,并且可以正常工作。是的!
但是我想知道是否有任何方法可以为相同Django模型的不同对象创建cronjob。
Settings.py
CELERY_BEAT_SCHEDULE = {
'ok': {
'task' : 'bill.tasks.ok',
'schedule' : crontab(minute=27, hour=0),
# 'args' : (*args)
}
}
bill / tasks.py
from celery import task
@task
def ok():
bills = Bill.objects.all()
for bill in bills:
perform_something(bill)
我想更改每个对象的crontab时间。我该怎么办?
假设我在模型对象中有一个小时和分钟值
感谢您的时间:)
好吧,我将无法找到如何为每个任务实例运行不同的crontab的方法。但是还有另一种运行方式。只需每小时运行一次crontab,然后每次在 tasks.py 中检查查询是否与当前时间匹配。
答案 0 :(得分:0)
您可以在参数中指定值,然后将其用于过滤QuerySet。
Settings.py
CELERY_BEAT_SCHEDULE = {
'ok_27_0': {
'task' : 'bill.tasks.ok',
'schedule' : crontab(minute=27, hour=0),
'args' : (27, 0)
},
'ok_5_any': {
'task' : 'bill.tasks.ok',
'schedule' : crontab(minute=5),
'args' : (5, None)
}
}
bill / tasks.py
from celery import task
@task
def ok(minute=None, hour=None):
bills = Bill.objects.all()
if minute is not None:
bills = bills.filter(minute=minute)
if hour is not None:
bills = bills.filter(hour=hour)
for bill in bills:
perform_something(bill)
编辑:
您可能还想尝试绑定任务,并查看是否可以在任务实例或其请求中找到该任务的计划。这样,您就不必在设置中重复自己。但是,我不知道这是否可能。
@task(bind=True)
def ok(self):
self.request