1.安装redis,参考redis文件夹:redis安装文档:redisinstallation.note链接:http://note.youdao.com/notesh...2.Django项目配置1.安装依赖包pipinstallcelerypipinstallcelery-with-redispipinstalldjango-celery2,配置settings.py文件importdjcelery#registerjdceleryINSTALLED_APPS=[...,'djcelery',]#celerysettings#celerymiddlemanredis://redisserviceipaddress:port/databasenumberBROKER_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时区设置,使用与设置中TIME_ZONE相同的时区CELERY_TIMEZONE=TIME_ZONE创建项目目录中的芹菜。pyfile#coding:utf-8from__future__importabsolute_import,unicode_literalsfromceleryimportCeleryfromdjango.confimportsettingsimportos#获取当前文件夹名,也就是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的设置文件配置celeryapp.config_from_object('django.conf:settings')#Celery加载项目目录下所有注册的应用程序app.autodiscover_tasks(lambda:settings.INSTALLED_APPS)_在_init__.py文件中添加:#importceleryinstanceobject#必须在文件最前面添加,否则会报错from__future__importabsolute_import,unicode_literalsfrom.celeryimportappascelery_app__all__=[celery_app]创建对应app.py文件目录下的tasks注意:tasks.py文件必须在应用的根目录下创建,文件名是固定的。在这个文件中加入你对应的后台任务代码,并注解@taskimporttimefromceleryimporttask,Celeryapp=Celery('tasks',broker='redis://redis_ip:6379/0',backend='redis://redis_ip:6379/0')#在这里添加你的后台任务方法代码,并注解任务@taskdefadd(a,b):print("Thisisthestartofthetask")c=a+bprint(c)time.sleep(10)print("Thisistheendofthetask")3.在pythonmanage.pyshell中启动celeryworker在命令中输入celery-Aproject_nameworker--pool=solo-linfo,如如下图所示,即启动成功4.测试在tasks.py文件中添加测试代码,这里复用上面tasks.py代码中的add方法,在views.py文件中创建一个测试视图方法:from.importtasksdefadd(request,*args,**kwargs):tasks.add.delay(1,2)result={'code':0,'msg':'Thisisabackgroundtask'}returnJsonResponse(result)在urlfromdjango.urlsimportpathfrom中配置url路径。importviewsurlpatterns=[path('add',views.add,name="add")]启动django然后调用对应的url。在manage.pyshell日志中发现响应等待后台任务执行只需要63ms。发现任务执行完毕,耗时10s以上(因为上面的代码sleep了10s)至此celery已经成功运行。三、问题的积累1、启动celeryworker时,报连接失败(1)可能是绑定没有注释,只允许本地访问;参考redis配置项(2)保护模式关闭,参考redis配置项(3)requiredAuthentication2.运行后台任务时,报错kombu.exceptions.ContentDisallowed:Refusingtodeserializeuntrustedcontentoftypepickle(application/x-python-serialize)https://blog.csdn.net/libing_thinking/article/details/78622943kombu.exceptions.ContentDisallowed:Refusingtodeserializeuntrustedcontentoftypepickle(application/x-python-serialize)需要修改settings.py文件中的celery配置CELERY_ACCEPT_CONTENT=['pickle',]3.运行后台任务时报错AttributeError:'str'objecthasnoattribute'items'python版本是3.6#好像是redis的版本高了,重装pipinstallredis==2.10.64后可以解决,启动celery时报错:TypeError:canonlyconcatenatetuple(not"NoneType”)totuple此问题是由于安装包不完整,检查是否安装了以下安装包:pipinstallcelerypipinstallcelery-with-redispipinstalldjango-celery
