在创建网页应用时,常常需要执行 耗时较长的任务。例如:

  • 当用户注册时,需要发送认证邮件。
  • 每天晚上12点,需要自动执行数据清理任务。
  • 当用户预约某项任务时,需要在指定时间执行。

Django 默认以即刻回应请求的方式运作,因此,需要有异步处理耗时任务的方法。 这就是 Celery 的用武之地!🚀

Celery 是一个帮助 Django 执行异步任务的强大工具,而 Celery-Beat 则可以帮助在预定时间执行特定任务。

Django Celery-Beat 任务调度示意图

1️⃣ 在 Django-Celery-Beat 中设置定时任务的方法

在 Celery-Beat 中设置定时任务的方法大致有两种。

✅ (1) 通过 Django Admin 的 GUI 设置定时

Django-Celery-Beat 支持直接在 Django Admin 中通过 GUI 设置定时任务

📌 特点
  • 可以通过简单的设置而不需编码来执行周期性任务。
  • 可以在 Django 管理界面中通过UI 设置和修改周期性任务。
  • 但,由于这是静态设置,因此很难根据用户请求动态更改。
📌 适合在什么情况下使用?
  • 不需要与应用程序和用户之间的交互的情况
  • 例如) 每天午夜自动执行数据备份的任务
  • 例如) 每天早上星期一更新某些 API 数据的任务

✅ (2) 通过 Python 代码动态创建定时任务

也可以通过代码直接创建 Celery-Beat 的定时任务

📌 特点
  • 可以根据用户的请求动态创建定时任务。
  • 可以通过代码创建、修改和删除定时任务。
  • 无需通过 Admin,可以在视图中直接注册周期性任务。
📌 适合在什么情况下使用?
  • 当需要根据用户的特定请求生成定时任务时。
  • 例如) 用户"预约订单"后,注册在两个小时后自动取消的任务。
  • 例如) 用户设置"邮件提醒"功能时,注册在规定时间发送提醒邮件。

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="发送提醒邮件",  # 任务名称
    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”! 😊