django+redis+celery異步任務執行

1、安裝redis

參考redis文件夾下:redis安裝python

文檔:redis安裝.note
連接: http://note.youdao.com/notesh...

2、django工程配置

一、安裝依賴包

pip install celery 
pip install celery-with-redis 
pip install django-celery

二、配置

settings.py文件redis

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文件必定要建立在應用根目錄下,且文件名固定,在該文件裏添加你對應的後臺任務代碼,並註解@taskshell

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("這是任務結束")

三、啓動celery worker

在python manage.py shell命令中輸入數據庫

celery -A project_name worker --pool=solo -l info

以下圖,即爲啓動成功
clipboard.pngdjango

四、測試

在tasks.py文件中加入測試代碼,這裏複用上面tasks.py代碼中的add方法json

在views.py文件中建立測試view方法:app

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") ]

啓動djangourl

而後調用對應url,發現響應只用63ms
clipboard.pngspa

在manage.py shell日誌中靜候後臺任務執行,發現任務已經執行,耗時10s多(由於上述代碼sleep了10s)
clipboard.png
到這裏,celery已成功運行。

3、問題積累

一、啓動celery worker時,報連接失敗

(1)多是限制bind沒有註釋,僅容許本機訪問;參考redis配置項

(2)保護模式爲關閉,參考redis配置項

(3)須要鑑權

二、運行後臺任務時,報錯 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', ]

三、運行後臺任務時,報錯AttributeError: 'str' object has no attribute 'items'

python版本爲3.6

#貌似是redis版本高了,從新安裝後得以解決 pip install redis==2.10.6

四、啓動celery時報錯:TypeError: can only concatenate tuple (not 「NoneType」) to tuple

這個問題是因爲安裝包不全致使的,分別檢查是否安裝瞭如下安裝包:

pip install celery
pip install celery-with-redis
pip install django-celery
相關文章
相關標籤/搜索