在之前的文章中,我们通过 Django-Celery-Beat: 如何创建预定任务 了解了 Django-Celery-Beat 中创建预定任务的 基本方法。
📌 点击标题查看之前的文章!
但是在实际项目中,仅仅 在预定时间重复执行 通常是不够的。
- 可能需要限制在特定时间执行,
- 需要动态更改执行周期,
- 在特定条件下暂时停用任务,
- 可能还需要在特定日期后自动取消预定。
为了处理这种 复杂的逻辑,在本期中,我们将 更深入地探讨 Django-Celery-Beat 中的 PeriodicTask 模型以及各种字段和设置方法! 🚀
1️⃣ 利用 update_or_create 设置 PeriodicTask
在实际服务中,修改预定任务以适应用户请求和环境变化的情况更多于直接创建的情况。
因此,使用 PeriodicTask.objects.create()
而不是 update_or_create()
方法更为实用。
📌 使用 update_or_create()
时,
- 如果任务已存在则更新
- 如果不存在则新建
也就是说,当存在同名的预定任务时,可以覆盖它,以避免不必要的重复实例。
2️⃣ PeriodicTask.interval 字段与 IntervalSchedule 模型
Django-Celery-Beat 的 PeriodicTask
可以通过 interval
字段设置 重复执行的间隔。
由于这个 interval
字段与 IntervalSchedule
模型相关联,因此必须先创建 IntervalSchedule
实例,然后在 PeriodicTask
中引用它。
也就是说,预定任务的注册步骤为:
- 首先创建
IntervalSchedule
实例 - 然后将创建的
IntervalSchedule
连接到PeriodicTask
3️⃣ IntervalSchedule 字段选项
字段名 | 描述 | 示例值 |
---|---|---|
every |
重复周期的数值 | 10 , 30 , 2 |
period |
重复周期的单位 | IntervalSchedule.SECONDS , IntervalSchedule.MINUTES , IntervalSchedule.HOURS , IntervalSchedule.DAYS |
4️⃣ 利用 update_or_create 配置 PeriodicTask 示例
from django_celery_beat.models import PeriodicTask, IntervalSchedule
import json
# 创建 IntervalSchedule (每 10 分钟执行一次)
schedule, created = IntervalSchedule.objects.get_or_create(
every=10,
period=IntervalSchedule.MINUTES
)
# 创建或更新 PeriodicTask
task, created = PeriodicTask.objects.update_or_create(
name="send_reminder_email",
defaults={
"interval": schedule,
"task": "myapp.tasks.send_reminder_email",
"args": json.dumps([1]),
"enabled": True,
}
)
5️⃣ PeriodicTask
的其他字段说明
字段名 | 描述 | 示例 |
---|---|---|
name |
任务的唯一名称 | "send_report_task" |
interval |
执行间隔 (IntervalSchedule 参考) |
schedule |
crontab |
在特定时间执行时 (CrontabSchedule 参考) |
None |
clocked |
在特定时间仅执行一次 (ClockedSchedule 参考) |
None |
task |
要执行的 Celery 任务 | "myapp.tasks.send_report" |
args |
传递给函数的参数(JSON 格式) | json.dumps([123, "email@example.com"]) |
kwargs |
传递给函数的关键字参数(JSON 格式) | json.dumps({"priority": "high"}) |
enabled |
执行状态 | True 或 False |
one_off |
只执行一次并结束 | True 或 False |
📌 如果将 one_off=True
设置为任务,在任务执行一次后 会被禁用但不会删除
📌 使用 clocked
字段可以预定 在特定的精确时间仅执行一次的任务。
🎯 结论:灵活管理预定任务需利用 update_or_create
!
📌 在 Django-Celery-Beat 中注册预定任务时使用 update_or_create()
可以轻松修改已有任务
📌 PeriodicTask.interval
字段参考 IntervalSchedule
,因此必须先创建 IntervalSchedule
实例后再进行连接。
📌 在管理复杂的预定任务时,利用 args
、kwargs
、enabled
、one_off
、clocked
等字段可以更灵活地进行设置。
🔥 下一期预告
在这一期中,我们了解了 如何更灵活地创建和修改 PeriodicTask。
下一期将讨论 如何利用 Crontab 设置在特定时间执行的预定任务,以及如何使用 Clocked 设置仅在特定时间执行一次的预定任务。
如果想要了解更深入的 Celery 使用方法,请期待下一期! 🚀
另外,如果想在博客中看到更多有关 Celery 的文章,
请查看下面的‘相关文章’列表或在右上方的搜索框中搜索“Celery”! 😊
댓글이 없습니다.