在之前的文章中,我们通过 Django-Celery-Beat: 如何创建预定任务 了解了 Django-Celery-Beat 中创建预定任务的 基本方法

📌 点击标题查看之前的文章!

但是在实际项目中,仅仅 在预定时间重复执行 通常是不够的。

  • 可能需要限制在特定时间执行,
  • 需要动态更改执行周期,
  • 在特定条件下暂时停用任务,
  • 可能还需要在特定日期后自动取消预定。

为了处理这种 复杂的逻辑,在本期中,我们将 更深入地探讨 Django-Celery-Beat 中的 PeriodicTask 模型以及各种字段和设置方法! 🚀

Django Celery-Beat PeriodicTask illustration

1️⃣ 利用 update_or_create 设置 PeriodicTask

在实际服务中,修改预定任务以适应用户请求和环境变化的情况更多于直接创建的情况。

因此,使用 PeriodicTask.objects.create() 而不是 update_or_create() 方法更为实用。

📌 使用 update_or_create() 时,

  1. 如果任务已存在则更新
  2. 如果不存在则新建

也就是说,当存在同名的预定任务时,可以覆盖它,以避免不必要的重复实例。

2️⃣ PeriodicTask.interval 字段与 IntervalSchedule 模型

Django-Celery-Beat 的 PeriodicTask 可以通过 interval 字段设置 重复执行的间隔

由于这个 interval 字段与 IntervalSchedule 模型相关联,因此必须先创建 IntervalSchedule 实例,然后在 PeriodicTask 中引用它。

也就是说,预定任务的注册步骤为:

  1. 首先创建 IntervalSchedule 实例
  2. 然后将创建的 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 执行状态 TrueFalse
one_off 只执行一次并结束 TrueFalse

📌 如果将 one_off=True 设置为任务,在任务执行一次后 会被禁用但不会删除

📌 使用 clocked 字段可以预定 在特定的精确时间仅执行一次的任务

🎯 结论:灵活管理预定任务需利用 update_or_create

📌 在 Django-Celery-Beat 中注册预定任务时使用 update_or_create() 可以轻松修改已有任务

📌 PeriodicTask.interval 字段参考 IntervalSchedule,因此必须先创建 IntervalSchedule 实例后再进行连接。

📌 在管理复杂的预定任务时,利用 argskwargsenabledone_offclocked 等字段可以更灵活地进行设置。

🔥 下一期预告

在这一期中,我们了解了 如何更灵活地创建和修改 PeriodicTask

下一期将讨论 如何利用 Crontab 设置在特定时间执行的预定任务,以及如何使用 Clocked 设置仅在特定时间执行一次的预定任务。

如果想要了解更深入的 Celery 使用方法,请期待下一期! 🚀

另外,如果想在博客中看到更多有关 Celery 的文章,

请查看下面的‘相关文章’列表或在右上方的搜索框中搜索“Celery”! 😊