Celery异步任务--Djcelery

一、首先看下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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值