在Django中集成Celery

一、基础概念理解

  1. 为什么需要 Celery?
    • 解决耗时任务阻塞 HTTP 请求的问题(如邮件发送、文件处理、AI 计算等)。
    • 实现异步任务、定时任务和分布式任务队列。
  2. 核心组件
    • 消息代理(Broker):Redis/RabbitMQ,负责传递任务消息。
    • Worker:执行任务的进程。
    • 结果存储(Backend):存储任务执行结果(可选)。

二、环境准备

  1. 安装依赖

    pip install celery redis  # 使用 Redis 作为 Broker
    pip install flower       # 可选,任务监控工具
    
  2. 项目结构

    your_project/
    ├── your_project/
    │   ├── __init__.py
    │   ├── celery.py       # 新增 Celery 初始化文件
    │   ├── settings.py
    │   └── urls.py
    └── your_app/
        └── tasks.py        # 存放异步任务
    

三、配置 Celery

  1. 创建 celery.py

    import os
    from celery import Celery
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
    app = Celery('your_project')
    app.config_from_object('django.conf:settings', namespace='CELERY')
    app.autodiscover_tasks()  # 自动发现所有 Django App 中的 tasks.py
    
  2. 修改 __init__.py

    from .celery import app as celery_app
    __all__ = ('celery_app',)
    
  3. 配置 settings.py

    # Celery 配置
    CELERY_BROKER_URL = 'redis://localhost:6379/0'  # Broker 地址
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'  # 结果存储(可选)
    CELERY_TIMEZONE = 'Asia/Shanghai'  # 时区设置
    

四、编写第一个异步任务

  1. 在 App 中创建 tasks.py

    from celery import shared_task
    from django.core.mail import send_mail
    
    @shared_task
    def add(x, y):
        return x + y
    
  2. 调用异步任务

    # 在视图或其他地方调用
    from your_app.tasks import add
    
    def register_user(request):
        # ... 用户注册逻辑
        add.delay(98, 98)  # 异步执行
        return HttpResponse("Registered!")
    

五、运行 Celery

  1. 启动 Worker

    celery -A your_project worker --loglevel=info
    
  2. 启动 Beat(定时任务)

    celery -A your_project beat --loglevel=info
    
  3. 监控任务(可选)

    celery -A your_project flower  # 访问 http://localhost:5555
    

六、定时任务配置

settings.py 中定义周期性任务:

from celery.schedules import crontab

CELERY_BEAT_SCHEDULE = {
    'cleanup-every-night': {
        'task': 'your_app.tasks.add',
        'schedule': crontab(hour=3, minute=30),  # 每天凌晨3:30执行
    },
}

七、进阶技巧

  1. 任务重试与错误处理

    @shared_task(bind=True, max_retries=3)
    def process_data(self, data):
        try:
            # 处理数据...
        except Exception as e:
            self.retry(exc=e, countdown=60)  # 60秒后重试
    
  2. 任务链与组合

    from celery import chain
    chain(task1.s(), task2.s(), task3.s()).apply_async()
    
  3. 结果处理

    result = add.delay(98, 98)
    print(result.get(timeout=10))  # 获取任务结果(阻塞)
    

八、生产环境注意事项

  1. 使用 Supervisor 管理进程

    [program:celery_worker]
    command=celery -A your_project worker --loglevel=info
    directory=/path/to/your_project
    autostart=true
    autorestart=true
    
  2. 优化并发

    celery -A your_project worker --concurrency=4  # 根据 CPU 核心数调整
    
  3. 安全配置

    • 为 Redis 设置密码。
    • 记得保护 Broker 端口。
posted @ 2025-02-19 23:17  rxg456  阅读(222)  评论(0)    收藏  举报