Win10系統下使用Django2.0.4+Celery4.4.2+Redis來實現異步任務隊列以及定時(週期)任務(2020年最新攻略)

原文轉載自「劉悅的技術博客」v3u.cn/a_id_153python

首先明確一點,celery4.1+的官方文檔已經詳細說明,該版本以後不須要引入依賴 django-celery 這個庫了,直接用 celery 自己就能夠了,就在去年年初的一篇文章python3.7.2+Django2.0.4 使用django-celery遇到的那些坑,中提到的一些bug,在今年早已不復存在,因此技術更新頻率愈來愈快,本文詳細闡述用新版Celery(4.4.2)來實現。mysql

關於celery的底層原理這裏就不贅述了,簡單的流程圖就能夠一圖以蔽之redis

安裝對應的庫sql

pip3 install celery==4.4.2
pip3 install eventlet==0.25.2
pip3 install Django==2.0.4
複製代碼

eventlet是一個高性能協程庫,用來解決win10下celery進程的bugdjango

配置settings.py文件:json

CELERY_BROKER_URL = 'redis://localhost:6379/'  
  
CELERY_RESULT_BACKEND = 'redis://localhost:6379/'  
  
CELERY_RESULT_SERIALIZER = 'json'
複製代碼

這裏broker配置redis,同時backend也就是任務結果也存到redis中,格式爲json,方便讀寫。瀏覽器

在settings.py同級目錄建立celery.pybash

from __future__ import absolute_import, unicode_literals  
import os  
from celery import Celery  
  
# 設置環境變量 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mydjango.settings')  
  
# 註冊Celery的APP 
app = Celery('mydjango')  
# 綁定配置文件 
app.config_from_object('django.conf:settings', namespace='CELERY')  
  
# 自動發現各個app下的tasks.py文件 
app.autodiscover_tasks()
複製代碼

注意mydjango爲你當前的django項目名稱app

修改settings.py同級目錄的init.py文件異步

from __future__ import absolute_import, unicode_literals  
from .celery import app as celery_app  
  
#導包 
import pymysql  
#初始化 
pymysql.install_as_MySQLdb()  
  
  
  
__all__ = ['celery_app']
複製代碼

在應用中建立tasks.py文件

from celery.task import task  
  
# 自定義要執行的task任務 
@task  
def print_test():  
	print("nict try")  
	return 'hello'
複製代碼

若是須要,也能夠在settings.py裏將該任務配置爲定時任務(週期任務)

from celery.schedules import crontab  
CELERY_BEAT_SCHEDULE = {  
    # 週期性任務 
    'task-one': {  
        'task': 'myapp.tasks.print_test',  
        'schedule': 5.0, # 每5秒執行一次 
        # 'args': () 
    }  
}
複製代碼

同時異步任務也能夠經過django的視圖進行在線調用

from myapp import tasks  
  
def ctest(request,*args,**kwargs):  
    res=tasks.print_test.delay()  
    #任務邏輯 
    return JsonResponse({'status':'successful','task_id':res.task_id})
複製代碼

這裏的delay方法就是異步方式請求,而非django默認的同步執行步驟

在manage.py的目錄下啓動celery服務

celery worker -A mydjango -l info -P eventlet
複製代碼

在瀏覽器中調用異步服務接口

同時也能夠在backend中查詢任務結果

注意一點,redis中的key並非單純的task_id,而是須要加上前綴celery-task-meta-

最後,若是須要啓動定時任務,就須要在manage.py所在的文件夾內單獨啓動beat服務

celery -A mydjango beat -l info
複製代碼

能夠看到任務隊列會每隔五秒執行一次定時任務

整體而言,Celery4.4.2解決了不少bug,好比著名的async關鍵字的問題,同時優化了性能,在eventlet協程庫的加持下,更加如虎添翼,准入門檻也比之前低了很多。

原文轉載自「劉悅的技術博客」 v3u.cn/a_id_153

相關文章
相關標籤/搜索