首页 > 解决方案 > 使用 Celery 的单个 Django 模型的每个对象的不同 crontab

问题描述

我能够创建 celery_beat_schedule 并且它可以工作。耶!

但我想知道是否有任何方法可以为同一 Django 模型的不同对象创建 cronjob。

设置.py

CELERY_BEAT_SCHEDULE = {
    'ok': {
        'task' : 'bill.tasks.ok',
        'schedule' : crontab(minute=27, hour=0),
        # 'args' : (*args)
    }
}

账单/tasks.py

from celery import task
@task
def ok():
    bills = Bill.objects.all()
    for bill in bills:
        perform_something(bill)

谢谢你的时间 :)

好吧,我将无法找到如何为每个任务实例运行不同的 crontab。但是还有另一种运行方式。只需每小时运行一次 crontab,每次检查您的查询是否与tasks.py中的当前时间匹配。

标签: djangocroncelerycelerybeat

解决方案


您可以在参数中指定值,然后在过滤 QuerySet 时使用它们。

设置.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)
    }
}

账单/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

推荐阅读