一、装置redis
参考redis文件夹下:redis装置
文档:redis装置.note
链接:http://note.youdao.com/notesh...
二、django工程配置
1、装置依赖包
pip install celery pip install celery-with-redis pip install django-celery
2、配置
settings.py文件
import djcelery #注册jdcelery INSTALLED_APPS = [ ... ,'djcelery', ] # celery 设置 # celery中间人 redis://redis服务所在的ip地址:端口/数据库号 BROKER_URL = 'redis://redis_ip:6379/0' # celery后果返回,可用于跟踪后果 CELERY_RESULT_BACKEND = 'redis://redis_ip:6379/0' # celery内容等音讯的格局设置,这里应用pickle,如果不应用,会序列化报错 CELERY_ACCEPT_CONTENT = ['pickle', ] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' # celery时区设置,应用settings中TIME_ZONE同样的时区 CELERY_TIMEZONE = TIME_ZONE
在工程目录下,创立celery.py文件
# coding:utf-8 from __future__ import absolute_import, unicode_literals from celery import Celery from django.conf import settings import os# 获取以后文件夹名,即为该Django的我的项目名 project_name = os.path.split(os.path.abspath('.'))[-1] project_settings = '%s.settings' % project_name # 设置环境变量 os.environ.setdefault('DJANGO_SETTINGS_MODULE', project_settings)# 实例化Celery,网上很多教程这里都是没有设置broker造成启动失败 app = Celery('tasks', broker='redis://redis_ip:6379/0', backend='redis://redis_ip:6379/0') # 应用django的settings文件配置celery app.config_from_object('django.conf:settings') # Celery加载所有注册的利用 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
在工程目录的__init__.py文件中增加:
# 引入celery实例对象 # 肯定要增加在文件最后面,否则会报错 from __future__ import absolute_import, unicode_literals from .celery import app as celery_app __all__ = [celery_app]
在对应app的目录下创立tasks.py文件
留神:tasks.py文件肯定要创立在利用根目录下,且文件名固定,在该文件里增加你对应的后台任务代码,并注解@task
import time from celery import task, Celery app = Celery('tasks', broker='redis://redis_ip:6379/0', backend='redis://redis_ip:6379/0')#在这里增加你的后台任务办法代码,并注解task @task def add(a, b): print("这是工作开始") c = a + b print(c) time.sleep(10) print("这是工作完结")
3、启动celery worker
在python manage.py shell命令中输出
celery -A project_name worker --pool=solo -l info
如下图,即为启动胜利
4、测试
在tasks.py文件中退出测试代码,这里复用下面tasks.py代码中的add办法
在views.py文件中创立测试view办法:
from . import tasks def add(request,*args,**kwargs): tasks.add.delay(1, 2) result = {'code': 0, 'msg': '这是一个后台任务'} return JsonResponse(result)
在url中配置url门路
from django.urls import path from . import views urlpatterns = [ path('add', views.add, name="add") ]
启动django
而后调用对应url,发现响应只用63ms
在manage.py shell日志中静候后台任务执行,发现工作曾经执行,耗时10s多(因为上述代码sleep了10s)
到这里,celery已胜利运行。
三、问题积攒
1、启动celery worker时,报链接失败
(1)可能是限度bind没有正文,仅容许本机拜访;参考redis配置项
(2)保护模式为敞开,参考redis配置项
(3)须要鉴权
2、运行后台任务时,报错 kombu.exceptions.ContentDisallowed: Refusing to deserialize untrusted content of type pickle (application/x-python-serialize)
https://blog.csdn.net/libing_thinking/article/details/78622943
kombu.exceptions.ContentDisallowed: Refusing to deserialize untrustedcontent of type pickle (application/x-python-serialize)
须要将settings.py文件中批改celery配置
CELERY_ACCEPT_CONTENT = ['pickle', ]
3、运行后台任务时,报错AttributeError: 'str' object has no attribute 'items'
python版本为3.6
#貌似是redis版本高了,重新安装后得以解决 pip install redis==2.10.6
4、启动celery时报错:TypeError: can only concatenate tuple (not “NoneType”) to tuple
这个问题是因为安装包不全导致的,别离查看是否装置了以下安装包:
pip install celerypip install celery-with-redispip install django-celery