使用Celery对于单个Django模型的每个对象使用不同的crontab

时间:2019-05-02 19:30:35

标签: django cron celery celerybeat

我能够创建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 中检查查询是否与当前时间匹配。

1 个答案:

答案 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