Celery官網http://www.celeryproject.org/html
學習資料:http://docs.jinkan.org/docs/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
建立項目和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
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