Django的异步任务队列管理_Celery

1 基本原理

Celery 是一个异步任务队列,能够将耗时操作(如发邮件、处理图片、网络爬虫等)从 Django 主线程中分离出来,由后台的 worker 处理,避免阻塞请求。Celery 作为独立运行的后台进程(Worker),持续监听消息队列(Broker),接收并处理任务,而 Django 主线程用于发布任务。

Celery 是一种独立于 Django 的程序,通常需手动启动。它通过 Redis 等工具与主线程进行通信,并将任务进度和结果写入数据库,方便后续追溯。

基本流如下:

1.1 消息中间件 Broker

Django 和 Celery 通过消息中间件(Broker)进行通信,最常用的选择是 Redis 或 RabbitMQ,因为它们速度快且稳定。如果可以接受安装 Redis(在本地启动只需一条命令),建议直接使用它。当然,还可以考虑其他替代方案。

以批处理为例,时序图如下:

2 memory 方式实现

为了简化步骤,我先测试了 memory 方法。

2.1 安装 Celery

复制代码
$ pip install celery

2.2 加入项目

  • 创建 myproject/my_celery.py 文件,内容如下:

    import os
    from celery import Celery

    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

    app = Celery('myproject') # 注意改成自己的 myproject 名

    app.conf.broker_url = 'memory://'
    app.conf.result_backend = 'cache+memory://'

    app.autodiscover_tasks()

  • myproject/__init__.py 里加入:

    from .my_celery import app as celery_app all = ['celery_app']`

2.3 异步功能函数

添加异步功能:在应用的 tasks.py 中定义任务:

复制代码
from celery import shared_task

@shared_task
def add(x, y):
    print(f"Adding {x} + {y}")
    return x + y

调用异步功能:

复制代码
from myapp.tasks import add

add.delay(2, 3)

注意:由于 memory 维护不佳,建议直接使用 Redis。

3 redis 方式实现

3.1 使用 docker 方式安装 redis

复制代码
docker run -d --name redis-dev -p 6379:6379 redis

3.2 安装 redis 包

复制代码
pip install redis

3.3 修改代码

替换设置部分:

复制代码
app.conf.update(
    broker_url='redis://localhost:6379/0', # 如果在docker中使用,需要转换成宿主机ip
    result_backend='redis://localhost:6379/1',
    task_serializer='json',
    accept_content=['json'],
    timezone='Asia/Shanghai',
    enable_utc=True,
)

3.4 启动 celery

一般情况下,需要手动启动 celery 进程

复制代码
celery -A your_project worker --loglevel=info
相关推荐
小刘在重生~3 小时前
Django 全套入门笔记|安装、项目创建、ORM、Form、中间件、登录认证
笔记·中间件·django
大模型丫丫2 天前
工业级 RAG 为什么需要 Elasticsearch?
elasticsearch·django·jenkins
Mr数据杨2 天前
【Codex】接入音频转录服务实现课堂语音结构化处理
django·音视频·codex·项目开发
Mr数据杨4 天前
【Codex】用学生考试初始化模块批量准备考试基础数据
django·codex·项目开发
典典分享指南4 天前
Excel SUMIFS 跨表汇总实战:多表条件求和的完整指南
django·flask·numpy·pyqt·fastapi
BYSJMG4 天前
计算机毕设选题|基于大数据与文本挖掘的自动驾驶事故成因分析及可视化研究|Hadoop+PySpark+Django+Vue
大数据·hadoop·信息可视化·django·自动驾驶·kmeans·课程设计
Mr数据杨5 天前
【Codex】用下载中心模块管理系统导出文件与下载任务
django·codex·项目开发
171320330计算机毕设编程5 天前
2027计算机毕设五大方向对比&选题推荐
java·ide·python·算法·django·php·推荐算法
青 春 记 忆5 天前
零基础入门python43:Django接口测试与库存边界
python·django·后端开发
Mr数据杨5 天前
【Codex】用智能助手问题反馈模块收集AI使用问题
人工智能·django·codex·项目开发