一、什么是Celery

Celery的主要特点之一是其能够进行异步任务处理。这意味着您可以安排任务在未来的某个时间点执行,而不会阻塞您的主程序或应用程序。您可以使用Celery将复杂的工作流程分解为多个小任务,这些任务可以在多个工作者或服务器之间进行分发和处理。这使得Celery特别适合需要大规模并行处理的应用程序。celery官方文档:https://docs.celeryq.dev/en/stable/index.html

二、Celery的应用场景

  1. 大规模数据处理:Celery可以将一个大任务分解为多个小任务,这些小任务可以在多个工作者或服务器之间进行分发和处理。这使Celery特别适合大数据和机器学习等需要大规模并行处理的应用。
  2. 异步任务:Celery可以进行异步任务处理,例如发送邮件、推送通知、执行定期任务等,这些任务可以在未来的某个时间点执行,而不会阻塞主程序或应用程序。
  3. 定时任务:Celery还可以用于处理周期性任务,比如每天或每周定时执行的任务。这在许多web应用中都有广泛的应用,如数据分析、系统监控等。

三、Celery的工作原理

在Celery中,主要有三个组件,分别是生产者(Producer)、消费者(Worker)和消息队列(Broker)。

生产者:向消息队列发送任务的部分,通常是主应用程序(Django项目),比如我们的代码中生产了一个发送邮件的任务。

消息队列:也被称为Broker,是一个在生产者和消费者之间传递消息的中介。当生产者发送一个任务时,这个任务将被放入消息队列中,等待消费者来取出并执行。一般使用Redis、RabbitMQ来作为消息队列。

消费者:也就是我们通常所说的Worker,是从消息队列中取出任务并执行的部分。在Celery中,可以有多个Worker同时工作,每个Worker可以运行在不同的服务器或进程中,以实现任务的并行处理。

Celery生产者与消费者模式工作原理

Celery生产者与消费者模式工作原理

Django和Redis工作流程

Django和Redis工作流程

四、Celery在Django中的使用

1. 安装

通过以下命令即可安装: pip install -U "celery[redis]"

2. 初始化Celery

首先在/oaback/oaback/celery.py 中添加以下代码:

import os
from celery import Celery
from celery.signals import after_setup_logger
import logging

# 设置django的settings模块,celery会读取这个模块中的配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'oaback.settings')

app = Celery('oaback')

## 日志管理
@after_setup_logger.connect
def setup_loggers(logger, *args, **kwargs):
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    # add filehandler
    fh = logging.FileHandler('logs.log')
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    logger.addHandler(fh)

# 配置从settins.py中读取celery配置信息,所有Celery配置信息都要以CELERY_开头
app.config_from_object('django.conf:settings', namespace='CELERY')

# 自动发现任务,任务可以写在app/tasks.py中
app.autodiscover_tasks()

# 测试任务
@app.task(bind=True, ignore_result=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

3. 配置Celery选项