在之前的文章中,我們透過 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 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
實例,然後才能連接。
📌 在管理複雜的預約工作時,可以靈活使用 args
、kwargs
、enabled
、one_off
、clocked
等字段來設置。
🔥 下篇預告
本期我們了解了 如何更靈活地創建和修改 PeriodicTask。
在下期中,我們將探討 如何利用 Crontab 設定在特定時間執行的預約工作,以及如何利用 Clocked 設定在特定時間僅執行一次的預約工作!
如果想要更深入了解 Celery 的應用,請期待下期! 🚀
此外,如果想在博客中查看與 Celery 相關的文章,
請查閱下面的 '相似文章' 列表,或在右上角的搜索框中搜索“Celery”!😊
Add a New Comment