在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 端口。

__EOF__

本文作者每天记录一点点,日积月累 - rxg456
本文链接https://www.cnblogs.com/rxg456/p/18725554.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   rxg456  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示