Django中Celery的實現介紹(一)

Django中Celery的實現

Celery官網http://www.celeryproject.org/html

學習資料:http://docs.jinkan.org/docs/celery/前端

  • Celery介紹

Celery是基於Python開發的一個分佈式任務隊列框架,支持使用任務隊列的方式在分佈的機器/進程/線程上執行任務調度。python

上圖展現的是Celery的架構,它採用典型的生產者-消費者模式,主要由三部分組成:broker(消息隊列)、workers(消費者:處理任務)、backend(存儲結果)。web

消息中間件:Celery自己不提供消息服務,可是能夠方便的和第三方提供的消息中間件集成。包括,RabbitMQ, Redis, MongoDB (experimental), Amazon SQS (experimental),CouchDB (experimental), SQLAlchemy (experimental),Django ORM (experimental), IronMQ。
任務執行單元:Worker是Celery提供的任務執行的單元,worker併發的運行在分佈式的系統節點中。
任務結果存儲:Task result store用來存儲Worker執行的任務的結果,Celery支持以不一樣方式存儲任務的結果,包括AMQP, Redis,memcached, MongoDB,SQLAlchemy, Django ORM,Apache Cassandra, IronCache。
redis

實際應用中,用戶從Web前端發起一個請求,咱們只須要將請求所要處理的任務放入任務隊列broker中,由空閒的worker去處理任務便可,處理的結果會暫存在後臺數據庫backend中。咱們能夠在一臺機器或多臺機器上同時起多個worker進程來實現分佈式地並行處理任務。shell

  • 安裝

pip install django  安裝django
數據庫

pip install celery==3.1.23 安裝celery
django

pip install django-celery  安裝django-celery
架構

對Redis的支持須要額外的依賴。你能夠用 celery[redis] 捆綁 同時安裝 Celery 和這些依賴併發

pip install -U celery[redis]

pip install python-jenkins  安裝jenkins 

  • 消息隊列

yum install -y rabbitmq-server  安裝rabbitmq

環境變量PATH加入/usr/lib/rabbitmq/bin

rabbitmq-plugins enable rabbitmq_management  啓用web管理插件

chkconfig rabbitmq-server on  開機自啓動

/etc/init.d/rabbitmq-server start  啓動RabbitMQ

增長用戶

rabbitmqctl add_user shhnwangjian 123456

rabbitmqctl set_user_tags shhnwangjian administrator

命令執行成功後,rabbitmq-server就已經安裝好並運行在後臺了。

WEB頁面訪問:http://ip地址:15672/

另外也能夠經過命令rabbitmq-server來啓動rabbitmq server以及命令rabbitmqctl stop來中止server。

更多的命令能夠參考rabbitmq官網的用戶手冊:https://www.rabbitmq.com/manpages.html

 

redis 安裝 http://redis.io/download

  • django中celery實現

建立項目和app

django-admin.py startproject celery-wj
cd celery-wj
django-admin.py startapp app01

配置settings.py

當djcelery.setup_loader()運行時,Celery便會去查看INSTALLD_APPS下包含的全部app目錄中的tasks.py文件,找到標記爲task的方法,將它們註冊爲celery task。
BROKER_URL和CELERY_RESULT_BACKEND分別指代你的Broker的代理地址以及Backend(result store)數據存儲地址。
在Django中若是沒有設置backend,會使用其默認的後臺數據庫用來存儲數據。注意,此處backend的設置是經過關鍵字CELERY_RESULT_BACKEND來配置,與通常的.py文件中實現celery的backend設置方式有所不一樣。通常的.py中是直接經過設置backend關鍵字來配置,以下所示:

test = Celery('tasks', backend='redis://10.10.83.162:16379/0', broker='redis://10.10.83.162:16379/9')

Django下要查看其餘celery的命令,包括參數配置、啓動多worker進程的方式均可以經過python manage.py celery --help來查看:

建立一個task

# -*- coding: utf-8 -*-

from celery import task

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

注意:與通常的.py中實現celery不一樣,tasks.py必須建在各app的根目錄下,且不能隨意命名。

views.py

# -*- coding: utf-8 -*-

from django.shortcuts import HttpResponse, render, redirect, HttpResponseRedirect
from app01 import tasks

def add_test(request):
    result = tasks.add.delay(2, 2)
    print result
    if result.ready():
        print "Task has run"
        if result.successful():
            print "Result was: %s" % result.result
        else:
            if isinstance(result.result, Exception):
                print "Task failed due to raising an exception"
                raise result.result
            else:
                print "Task failed without raising exception"
    else:
        print "Task has not yet run"
    return HttpResponse(result)

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^add/$', views.add_test, name='add'),
]

#先啓動服務
python manage.py runserver 0.0.0.0:9008
#再啓動worker
python manage.py celery worker -c 4 --logievel=info

 

經過terminal測試task

python manage.py shell

>>> from app01 import tasks
>>> tasks.add.delay(3,5)

經過頁面訪問測試task

 

  • Celery的可視化監控工具flower

1.安裝flower 

pip install flower 

2.啓動

python manage.py celery flower --port=9008(默認是5555端口)

3.幫助

python manage.py celery flower --help

4.可視化頁面

http://localhost:9008

參考博客:http://www.cnblogs.com/znicy/p/5626040.html

Django中如何使用django-celery完成異步任務: http://www.weiguda.com/blog/73/

djcelery入門:實現運行定時任務: http://my.oschina.net/kinegratii/blog/292395

http://docs.jinkan.org/docs/celery/

相關文章
相關標籤/搜索