Django下使用djcelery+redis+celery实现的定时任务及异步任务

目录

  • 异步任务
    • 安装版本(不兼容导致报错)
    • 配置
    • 使用
  • 定时任务
    • settings配置
    • 启动
  • 参考

异步任务

安装版本(不兼容导致报错)

首先是安装这几个三方包,需要注意版本不兼容的情况下可能会报如下错误: AttributeError: 'str' object has no attribute 'items'这种情况是redis版本问题:若redis=3.2.0,降低版本redis=2.10.6即可解决,下面给出我使用的版本:

pip install redis==2.10.6
pip install django-celery==3.1.17
pip install celery==3.1.23

配置

首先可以在settings.py配置文件中首先需要添加如下两段配置:
1、INSTALLED_APPS 中需添加djcelery

INSTALLED_APPS = (
    ……   
    'djcelery'
    ……   
)  

2、启动及配置地址

import djcelery
djcelery.setup_loader()
BROKER_URL= '你的broker消息队列如RabbitMQ、Redis地址'
CELERY_RESULT_BACKEND = ‘结果接收地址’

之后可以创建一个异步任务task.py文件,其中需要如下配置:

app = Celery('tasks', backend=CELERY_RESULT_BACKEND, broker=BROKER_URL)

@app.task
def your_task():
	...
    return ...

也可以不配置settings.py文件直接在task.py文件中如下配置:

from celery import Celery

brokers = 'redis://127.0.0.1:6379/5'
backend = 'redis://127.0.0.1:6379/6'


app = Celery('tasks', broker=broker, backend=backend)

@app.task
def your_task():
	...
    return ...

使用

需要注意的是在views中调用该方法时需要在该方法后添加delay方法才能够进行异步调用

your_task.delay()

然后使用如下命令启动即可

#先启动服务器
python manage.py runserver
#再启动worker 
python manage.py celery worker -l info

定时任务

settings配置

创建定时任务需要配置CELERYBEAT_SCHEDULE,如下使用datetime模块下的timedelta实现定时任务(每30s执行一次)

CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/5'
BROKER_URL = 'redis://127.0.0.1:6379/6'

CELERY_TIMEZONE = 'Asia/Shanghai'

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
         'task': 'proj.tasks.add',
         'schedule': timedelta(seconds=30),
         'args': (16, 16)
    },
}

也可以使用celery模块下的crontab实现(每周一上午7:30执行一次)

from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
    # Executes every Monday morning at 7:30 A.M
    'add-every-monday-morning': {
        'task': 'tasks.add',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
        'args': (16, 16),
    },
}

启动

启动服务后需要启动beat才能够启动
python manage.py celery beat -l info

参考

1、启动时报错AttributeError: ‘str’ object has no attribute 'items
2、异步任务队列Celery在Django中的使用
3、异步任务神器 Celery 简明笔记
4、Celery定时任务

你可能感兴趣的:(Django,Python,celery)