Celery異步任務隊列/週期任務+ RabbitMQ + Django

1、Celery介紹和基本使用 

Celery 是一個 基於python開發的分佈式異步消息任務隊列,經過它能夠輕鬆的實現任務的異步處理, 若是你的業務場景中須要用到異步任務,就能夠考慮使用celery, 舉幾個實例場景中可用的例子:python

  1. 你想對100臺機器執行一條批量命令,可能會花很長時間 ,但你不想讓你的程序等着結果返回,而是給你返回 一個任務ID,你過一段時間只須要拿着這個任務id就能夠拿到任務執行結果, 在任務執行ing進行時,你能夠繼續作其它的事情。 
  2. 你想作一個定時任務,好比天天檢測一下大家全部客戶的資料,若是發現今天 是客戶的生日,就給他發個短信祝福

 

Celery 在執行任務時須要經過一個消息中間件來接收和發送任務消息,以及存儲任務結果, 通常使用rabbitMQ or Redis,後面會講web

Celery有如下優勢:redis

  1. 簡單:一單熟悉了celery的工做流程後,配置和使用仍是比較簡單的
  2. 高可用:當任務執行失敗或執行過程當中發生鏈接中斷,celery 會自動嘗試從新執行任務
  3. 快速:一個單進程的celery每分鐘可處理上百萬個任務
  4. 靈活: 幾乎celery的各個組件均可以被擴展及自定製

 

2、Django-Celery安裝

pip install django-celery  django

#注:安裝django-celery會自動安裝依賴版本的celerysession

 

3、Django settings設置celery

pip install django-celery  app

import djcelery
djcelery.setup_loader()
BROKER_URL = 'amqp://172.17.0.8:5672'
RESULT_BACKEND = 'amqp://172.17.0.8:5672'
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'djcelery',    #app這裏要增長djcelery
)
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

注:這裏Celery broker我用的RabbitMQ ,也能夠用redis異步

 

4、建立django-celery所須要的表

python manage.py migrateasync

 

5、在django app根目錄中建立tasks.py

python manage.py migrate分佈式

from celery import task
@task
def add(x, y):
    return x + y

 

6、View中調用定義的task

from django.shortcuts import render,HttpResponse
from web import tasks

def show(request):
res = tasks.add.delay(3,3)
print("start running task")
print("async task res",res.get() )
return HttpResponse('結果: %s'%res.get())

  

7、啓動worker並調用VIEW測試

python manage.py celery worker --loglevel=info

 

8、Celery定時週期任務

一、django admin中配置crontab測試

 

二、添加一個每分鐘執行一次的crontab

 

三、添加週期任務,並把task和crontab關聯

 

四、啓動worker 和 beat測試計劃任務

python manage.py celery worker --loglevel=info

python manage.py celery beat --loglevel=info

 

已看到任務在後臺每分鐘執行一次該任務。

相關文章
相關標籤/搜索