Celery异步任务--Djcelery

本文详细介绍了Celery在Django项目中的配置流程,包括安装依赖库、配置setting.py和celery.py文件,以及如何通过Redis作为消息中间件。此外,还提供了高级配置示例,如设置队列和路由,以及创建Celery worker的命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、首先看下Celery的工作框架:

二、介绍下配置文件:

1、首先安装一些组件库:

pip install celery
 
pip install celery-with-redis
 
pip install django-celery
 
sudo apt install redis-server

2、进行一些配置:

a、配置setting.py中的INSTALLED_APPS ,加入djcelery

# setting.py配置:
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 自己的app
    't8',
    # 第三方给定的
    'djcelery',
]

 b、配置taskconfig文件后面的app.config_from_object('taskconfig')会用到:

# celery配置
import djcelery
djcelery.setup_loader() #会自动加载INSTALL_APPS中项目的tasks.py文件中的task任务
BROKER_URL='redis://127.0.0.1:6379/1' # localhost
CELERY_CONCURRENCY=2  #(设置worker的并发数量)
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/2' # localhost

 c、配置celery.py文件:

# celery.py配置

from __future__ import absolute_import
from celery import Celery
from django.conf import settings
import os
 
# 设置系统的环境配置用的是Django的
os.environ.setdefault('DJANGO_SETTING_MODEULE','工程名字.settings')
 
# 实例化celery
app = Celery('mycelery')
 
# APP设置时区
app.conf.timezone = "Asia/Shanghai"
 
# 指定celery的配置来源 用的是项目的配置文件settings.py
app.config_from_object("django.conf:settings")
 
# 让celery自动去发现我们的任务(task)
app.autodiscover_tasks(lambda : settings.INSTALLED_APPS)
# 你需要在app目录下新建一个叫tasks.py(不能写错) 文件

或者:

from __future__ import absolute_import
import os
from celery import Celery, platforms
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'zp.settings')
# pylint: disable=C0103
app = Celery('celery_task')
#这个用的就是taskconfig文件中的配置文件见设置b
app.config_from_object('taskconfig')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

platforms.C_FORCE_ROOT = True

三、实践及命令配置:

这里还有一些高级配置项,包括队列的选择:

https://www.cnblogs.com/blackmatrix/p/8950381.html

这里举个例子说明:

1、设置的队列如下

CELERY_QUEUES = {
    "zp": {
        "exchange": "zp",
        "exchange_type": "direct",
        "routing_key": "zp"
    },
    "task": {
        "routing_key": "taskq",
        "exchange_type": "direct",
        "exchange": "taskq",
    }
    
}

2、设置不同的task任务对应的队列关系:

LCM_ROUTE_MAP = {'docker': {'queue': 'aa', 'routing_key': 'bb'},
                 'paas': {'queue': 'aa', 'routing_key': 'vv'}}
CELERY_ROUTES = {
    'zpa.tasks.run': {'queueA': 'task', 'routing_key': 'task'},
    'zpa.tasks.run_a': {'queue': 'zpa', 'routing_key': 'zpa'}
}

鉴于1、2可以看出,对于task.run的celery任务,会放到task队列中的celerywork去执行,那怎么配置worker对应的queue呢?见第三步:

3、创建celery worker:

python manage.py celery worker -A zp.celery_task -P gevent -c 100 -n task_worker  -Ofair -l error -Q task -f test_celery.log

其中,-Q指出该celery任务会去broker中的queue为task中的任务去执行,-n task_worker表示celery名称为task_worker,-A为app的意思,-P gevent代表以gevent(协程)的模式运行,-c代表并发量为100

gevent相关的知识可以参考:https://blog.csdn.net/yueguanghaidao/article/details/24281751

### Celery 和 django-celery 的关系及区别 Celery 是一个分布式任务队列系统,支持多种消息传递协议和调度器。它允许开发者将耗时的任务异步执行,从而提高应用程序的响应速度[^1]。 #### 使用 Celery 进行任务管理 当使用纯 Celery 时,开发者需要手动处理许多配置细节,例如设置 Broker URL、Result Backend 等参数。对于独立项目或非Django环境中的应用来说,这种方式提供了更大的灵活性: ```python from celery import Celery app = Celery('myproject', broker='pyamqp://guest@localhost//') ``` #### Django-Celery 扩展包的作用 `django-celery` 则专门为简化 Celery 在 Django 中的应用而设计。通过该扩展包可以更方便地集成 Celery 功能到基于 Django 开发的应用程序里。安装 `django-celery` 后,能够自动读取项目的 settings 文件来获取必要的配置项,并提供了一些额外的功能如周期性任务的支持等[^2]: ```python # settings.py CELERY_BROKER_URL = 'redis://localhost:6379/0' INSTALLED_APPS += ['djcelery'] ``` #### 主要差异总结 - **依赖关系**: 虽然两者都依赖于 Celery 核心库,但是 `django-celery` 提供了更多针对 Django 应用优化过的特性。 - **配置方式**: 使用原生 Celery 可能会涉及到更多的手工配置工作;相反,在 Django 项目中引入 `django-celery` 可以减少这部分负担并使配置过程更加直观简单。 - **功能增强**: `django-celery` 增加了对定时任务的支持以及其他一些专为 Web 开发场景定制化的改进措施。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值