九週二次課(12月19日)
17.1 celery簡介
17.2 celery小例子python
Celery 是什麼?git
Celery 是一個由 Python 編寫的簡單、靈活、可靠的用來處理大量信息的分佈式系統,它同時提供操做和維護分佈式系統所需的工具。github
Celery 專一於實時任務處理,支持任務調度。redis
說白了,它是一個分佈式隊列的管理工具,咱們能夠用 Celery 提供的接口快速實現並管理一個分佈式的任務隊列。app
首先,咱們要理解 Celery 自己不是任務隊列,它是管理分佈式任務隊列的工具,或者換一種說法,它封裝好了操做常見任務隊列的各類操做,咱們用它能夠快速進行任務隊列的使用與管理,固然你也能夠本身看 rabbitmq 等隊列的文檔而後本身實現相關操做都是沒有問題的。異步
Celery 是語言無關的,雖然它是用 Python 實現的,但他提供了其餘常見語言的接口支持。只是若是你剛好使用 Python 進行開發那麼使用 Celery 就天然而然了。分佈式
想讓 Celery 運行起來咱們要明白幾個概念:函數
brokers 中文意思爲中間人,在這裏就是指任務隊列自己,Celery 扮演生產者和消費者的角色,brokers 就是生產者和消費者存放/拿取產品的地方(隊列)工具
常見的 brokers 有 rabbitmq、redis、Zookeeper 等spa
顧名思義就是結果儲存的地方,隊列中的任務運行完後的結果或者狀態須要被任務發送者知道,那麼就須要一個地方儲存這些結果,就是 Result Stores 了
常見的 backend 有 redis、Memcached 甚至經常使用的數據均可以。
就是 Celery 中的工做者,相似與生產/消費模型中的消費者,其從隊列中取出任務並執行
就是咱們想在隊列中進行的任務咯,通常由用戶、觸發器或其餘操做將任務入隊,而後交由 workers 進行處理。
理解以上概念後咱們就能夠快速實現一個隊列的操做:
這裏咱們用 redis 當作 celery 的 broker 和 backend。
(其餘 brokers 與 backend 支持看這裏)
安裝 Celery 和 redis 以及 python 的 redis 支持:
1
2
3
|
apt-get install redis-server
pip install redis
pip install celery
|
這裏須要注意若是你的 celery 是 4.0 及以上版本請確保 python 的 redis 庫版本在 2.10.4 及以上,不然會出現 redis 鏈接 timeout 的錯誤,具體參考
而後,咱們須要寫一個task:
1
2
3
4
5
6
7
8
|
#tasks.py
from celery import Celery
app = Celery('tasks', backend='redis://localhost:6379/0', broker='redis://localhost:6379/0') #配置好celery的backend和broker
@app.task #普通函數裝飾爲 celery task
def add(x, y):
return x + y
|
OK,到這裏,broker 咱們有了,backend 咱們有了,task 咱們也有了,如今就該運行 worker 進行工做了,在 tasks.py 所在目錄下運行:
1
|
celery -A tasks worker --loglevel=info
|
意思就是運行 tasks 這個任務集合的 worker 進行工做(固然此時broker中尚未任務,worker此時至關於待命狀態)
最後一步,就是觸發任務啦,最簡單方式就是再寫一個腳本而後調用那個被裝飾成 task 的函數:
1
2
3
4
5
6
|
#trigger.py
from tasks import add
result = add.delay(4, 4) #不要直接 add(4, 4),這裏須要用 celery 提供的接口 delay 進行調用
while not result.ready():
time.sleep(1)
print 'task done: {0}'.format(result.get())
|
運行此腳本
delay 返回的是一個 AsyncResult 對象,裏面存的就是一個異步的結果,當任務完成時result.ready()
爲 true,而後用 result.get()
取結果便可。
到此,一個簡單的 celery 應用就完成啦。