原文轉載自「劉悅的技術博客」https://v3u.cn/a_id_153
首先明確一點,celery4.1+的官方文檔已經詳細說明,該版本之後不需要引入依賴 django-celery 這個庫了,直接用 celery 本身就可以了,就在去年年初的一篇文章python3.7.2+Django2.0.4 使用django-celery遇到的那些坑,中提到的一些bug,在今年早已不復存在,所以技術更新頻率越來越快,本文詳細闡述用新版Celery(4.4.2)來實現。
關於celery的底層原理這裏就不贅述了,簡單的流程圖就可以一圖以蔽之
安裝對應的庫
pip3 install celery==4.4.2
pip3 install eventlet==0.25.2
pip3 install Django==2.0.4
eventlet是一個高性能協程庫,用來解決win10下celery進程的bug
配置settings.py文件:
CELERY_BROKER_URL = 'redis://localhost:6379/'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/'
CELERY_RESULT_SERIALIZER = 'json'
這裏broker配置redis,同時backend也就是任務結果也存到redis中,格式爲json,方便讀寫。
在settings.py同級目錄創建celery.py
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項目名稱
修改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協程庫的加持下,更加如虎添翼,准入門檻也比以前低了不少。
原文轉載自「劉悅的技術博客」 https://v3u.cn/a_id_153