在之前的文章中,我們透過 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 Task "myapp.tasks.send_report"
args 傳遞給函數的參數 (JSON 格式) json.dumps([123, "email@example.com"])
kwargs 傳遞給函數的關鍵字參數 (JSON 格式) json.dumps({"priority": "high"})
enabled 執行狀態 True or False
one_off 執行一次後結束 True or False

📌 如果設置 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”!😊