django - 使用 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。但是还有另一种运行方式。只需每小时运行一次 crontab,每次检查您的查询是否与tasks.py中的当前时间匹配。
解决方案
您可以在参数中指定值,然后在过滤 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
推荐阅读
- vb.net - 如何检测另一个应用程序的窗口是否打开?
- python - 如何将 4D numpy 数组重塑为 3D 数组
- discord.py - 我的加入命令在将其移动到 cog 文件后中断,我找不到如何修复它
- r - 在 dplyr 中替代 Sapply
- php - 在 LIKE-Statement 的 raw-Query 中使用参数
- math - Pushdown Automata 解释
- github - Github 操作删除部署后的所有更改
- anaconda - Anaconda Spyder 更新
- excel - VBA Excel Selenium - 想要运行所有数据
- python - 使用 toml 对原始字符串(正则表达式)的无效解析