关于django:djangorediscelery异步任务执行

8次阅读

共计 2880 个字符,预计需要花费 8 分钟才能阅读完成。

一、装置 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 untrusted
content 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 celery
pip install celery-with-redis
pip install django-celery
正文完
 0