在構建網絡應用程序時,經常需要執行需要時間的任務。例如:

  • 當用戶註冊時需要發送驗證電子郵件。
  • 每晚12點自動執行數據清理任務。
  • 用戶安排特定任務時,需在指定時間執行。

Django默認以立即響應請求的方式工作,因此需要一種異步處理時間較長任務的方法。 這裡就需要用到Celery!🚀

Celery是Django中幫助管理異步任務的強大工具,而Celery-Beat則幫助在預定時間執行特定任務。

Django Celery-Beat task scheduling illustration

1️⃣ 如何在Django-Celery-Beat中設置定時任務

設置Celery-Beat的定時任務主要有兩種方法。

✅ (1) 在Django Admin中通過GUI設置

Django-Celery-Beat支持直接在Django Admin中通過GUI設置定時任務

📌 特點
  • 只需簡單設置而無需編碼即可執行定期任務。
  • 可以在Django管理頁面中通過UI設置和修改定期任務。
  • 但是,由於是靜態設置,因此與用戶請求相關聯時難以動態更改。
📌 什麼情況下適合使用?
  • 當應用程序與用戶之間不需要交互時
  • 例如)每天午夜自動執行數據備份任務
  • 例如)每週一早上更新特定API數據的任務

✅ (2) 通過Python代碼動態創建定時任務

也可以通過代碼直接創建Celery-Beat的定時任務。

📌 特點
  • 可以根據用戶的請求動態創建定時任務。
  • 可以通過代碼創建、修改和刪除預定任務。
  • 不需通過管理端,可以在視圖中直接註冊定期任務。
📌 什麼情況下適合使用?
  • 當用戶發生特定請求時需要定時任務。
  • 例如)當用戶"預約訂單"時,註冊2小時後自動取消的任務。
  • 例如)當用戶設定"電子郵件提醒"功能時,安排在指定時間發送提醒電子郵件。

2️⃣ [實作] 使用Python代碼創建定時任務

步驟1:定義Celery任務

from celery import shared_task

@shared_task
def send_reminder_email(user_id):
    # 在此處實現發送電子郵件的邏輯
    print(f"📧 向用戶 {user_id} 發送了提醒電子郵件!")

步驟2:在Django-Celery-Beat中創建PeriodicTask對象

from django_celery_beat.models import PeriodicTask, IntervalSchedule
import json

# 1️⃣ 創建執行間隔(Interval) (例如:每10分鐘執行一次)
schedule, created = IntervalSchedule.objects.get_or_create(
    every=10,  # 每10分鐘
    period=IntervalSchedule.MINUTES
)

# 2️⃣ 創建PeriodicTask
task = PeriodicTask.objects.create(
    interval=schedule,  # 執行間隔
    name="Send Reminder Email",  # 任務名稱
    task="myapp.tasks.send_reminder_email",  # 要執行的Celery任務名稱
    args=json.dumps([1]),  # 傳遞用戶ID(此為示例,傳遞用戶1)
)

🎯 結論:對Django開發者而言,Celery是必須的!

Celery是Django中管理異步任務和實現定時執行的必備工具

特別是利用Celery-Beat可以設置定期任務,並根據特定事件動態管理預定。

📌 總結:

  1. Django-Celery-Beat是一個強大的執行預定任務的工具。
  2. 利用Django Admin(GUI)可以輕鬆設置定期任務。
  3. 通過Python代碼創建任務可以與用戶請求相關聯,動態管理定時任務。
  4. 對於Django開發者來說,掌握Celery的基本概念及Celery-Beat是必要的!

🔥 下一篇預告

在這一篇中,我們簡單介紹了如何通過代碼創建Celery-Beat的定時任務。但是在實際操作中,會利用`PeriodicTask`模型的更多不同欄位應對複雜的邏輯。

下一篇我們將更詳細地探討如何安排各種任務的實際代碼,以及`PeriodicTask`模型的每個欄位的角色

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

而且,如果您想在博客中查看更多與Celery相關的文章,

請查看下面的'相似文章'列表,或者在右上角的搜索框中搜索"Celery"!😊