此文介紹 Celery 的基本用法。適合上手。
內容綱要:
0.概念。
1.選擇並安裝 Broker(消息傳送)。
2.安裝 Celery,並寫一個任務。
3.運行 woker,並調用任務。
4.保存結果。
好,開始吧。
Celery 是基於消息傳遞的異步任務隊列。
它專注於實時操作,也支持調度。
執行單元,稱爲Task,併發執行,在一個或多個worker servers中,使用多處理,Eventlet或gevent。Task能異步執行(在後臺)或同步執行(等到完成)。
1.RabbitMQ
RabbitMQ 功能完備、穩定、耐用,並且安裝簡便,是生產環境的絕佳選擇。
如果你使用 Ubuntu 或 Debian,可以執行這條命令來安裝 RabbitMQ:
$ sudo apt-get install rabbitmq-server
2.Redis
Redis 也是功能完備的,但更易受突然中斷或斷電帶來數據丟失的影響。
pip install -U celery[redis]
3.其它,如,數據庫等。
安裝 Celery:
$ pip install celery
Celery 應用:
Celery 應用。用於你想在 Celery 中做一切事——比如創建任務、管理worker——的入口點。
它必須可以被其他模塊導入。
創建 celery_task.py :
from celery import Celery
app = Celery('tasks', broker='amqp://guest@localhost//')
@app.task
def add(x, y):
return x + y
Celery 的第一個參數是當前模塊的名稱,這個參數是必須的,這樣的話名稱可以自動生成。第二個參數是中間人關鍵字參數,指定你所使用的woker的 URL,此處使用了 RabbitMQ,也是默認的選項。對於 RabbitMQ 你可以寫 amqp://localhost ,對於 Redis 你可以寫 redis://localhost .
你定義了一個單一任務,稱爲 add ,返回兩個數字的和。
運行 worker:
$ celery -A tasks worker --loglevel=info
[tasks]
. celery_task.add
[2016-10-18 23:25:41,835: INFO/MainProcess] Connected to redis://guest@localhost:6379//
[2016-10-18 23:25:41,858: INFO/MainProcess] mingle: searching for neighbors
[2016-10-18 23:25:42,885: INFO/MainProcess] mingle: all alone
[2016-10-18 23:25:42,910: WARNING/MainProcess] celery@ubuntu ready.
調用任務:
簡單的調用方式是delay()
>>> from celery_task import add
>>> add.delay(5,7)
<AsyncResult: 6d9561e9-26ae-4cbd-b651-38d365dd8897>
這時,在 worker 終端會有輸出:
[2016-10-18 23:26:28,605: INFO/MainProcess] Received task: celery_task.add[6d9561e9-26ae-4cbd-b651-38d365dd8897]
[2016-10-18 23:26:28,608: INFO/MainProcess] Task celery_task.add[6d9561e9-26ae-4cbd-b651-38d365dd8897] succeeded in 0.00114864204079s:
12
如果你想要保持追蹤任務的狀態,Celery 需要在某個地方存儲或發送這些狀態。舉例使用後端:Redis。
app = Celery('celery_task',
backend='redis://localhost', broker='redis://guest@localhost//')
>>> from celery_task import add
>>> result = add.delay(5,9)
>>>
>>> result.status
'SUCCESS'
>>> result.ready()
True
>>> result.result
14
>>> result.state
'SUCCESS'