Django中Celery簡介
阿新 • • 發佈:2018-11-01
初識Celery:
Celery 是一個 基於python開發的分散式非同步訊息任務佇列,通過它可以輕鬆的實現任務的非同步處理,可將一些耗時的任務放入該訊息佇列中處理,一些定時任務也可以放入佇列中自動執行,如定期去統計日誌,資料備份,或者其他的統計任務。
Celery基本工作流程:
Celery的安裝與配置
pip install celery pip install celery-with-redis pip install django-celery apt install redis-server三方庫的安裝
django中的配置:
ALLOWED_HOSTS = ['*'] INSTALLED_APPS = ( ... 'djcelery', } import djcelery djcelery.setup_loader() BROKER_URL='redis://localhost:6379/1' #任務佇列存放的位置 CELERY_CONCURRENCY=2 #設定worker的併發數量 CELERY_RESULT_BACKEND = 'redis://localhost:6379/2' #結果存放的位置View Code
在settings的同級目錄下新建一個celery.py的檔案
from __future__ import absolute_import #絕對路徑匯入 from celery import Celery from django.conf import settings import os #設定系統的環境配置用的是Django的 os.environ.setdefault('DJANGO_SETTING_MODULE','day9_ex.settings') #例項化celery app = Celery('mycelery') #設定時區 app.conf.CELERY_TIMEZONE = 'View CodeAsia/Shanghai' #指定celery的配置來源 用的是專案的配置檔案settings.py app.config_from_object('django.conf:settings') #讓celery 自動去發現我們的任務(task) app.autodiscover_tasks(lambda : settings.INSTALLED_APPS)
在settings.py的同級目錄的__init__.py檔案中匯入
#要寫在第一行 from __future__ import absolute_import #匯入工程目錄下celery中的app並起別名 from day9_ex.celery import app as celery_appView Code
Celery的使用
在需要使用非同步任務的app目錄下新建tasks.py,將要執行的非同步任務放在這裡面
from celery import task import time @task def test(n): for i in range(n): print(i) time.sleep(3)View Code
在views檢視函式中進行呼叫
from django.http import HttpResponse from django.shortcuts import render from app.tasks import test def test_celery(req): test.delay(6) return HttpResponse('ok')View Code
開始執行之前要先進行資料庫表的遷移
然後啟動worker,命令為python manage.py celery worker --loglevel=info (或者celery -A 工程名 worker -I info) (PS:日誌級別可以不寫)
然後在瀏覽器輸入url啟動專案
from datetime import timedelta CELERYBEAT_SCHEDULE = { 'schedule-test': { 'task': 'app.tasks.test2', #指定要執行的函式 'schedule': timedelta(seconds=6), # 執行的計劃時間,每6秒執行一次,可自定義 'args': () #引數 }, }View Code
還可使用下面這種配置
from celery.schedules import crontab CELERYBEAT_SCHEDULE = { 'schedule-test': { 'task': 'app.tasks.test2', #指定要執行的函式 'schedule': crontab(minute=48,hour=11), # 指定具體執行的計劃時間 'args': () #引數 }, }View Code
crontab的引數設定如上圖,也可以一個引數設定多個值,如day_of_week='1,2',表示每週一週二。
具體使用同異步處理。