Celery:分佈式任務隊列 簡單上手

此文介紹 Celery 的基本用法。適合上手。
內容綱要:
0.概念。
1.選擇並安裝 Broker(消息傳送)。
2.安裝 Celery,並寫一個任務。
3.運行 woker,並調用任務。
4.保存結果。

好,開始吧。

  • 概念
Celery 是基於消息傳遞的異步任務隊列。
它專注於實時操作,也支持調度。
執行單元,稱爲Task,併發執行,在一個或多個worker servers中,使用多處理,Eventlet或gevent。Task能異步執行(在後臺)或同步執行(等到完成)。

  • 選擇並安裝 Broker(消息傳送)。

1.RabbitMQ
RabbitMQ 功能完備、穩定、耐用,並且安裝簡便,是生產環境的絕佳選擇。

如果你使用 Ubuntu 或 Debian,可以執行這條命令來安裝 RabbitMQ:
$ sudo apt-get install rabbitmq-server

2.Redis
Redis 也是功能完備的,但更易受突然中斷或斷電帶來數據丟失的影響。
pip install -U celery[redis]

3.其它,如,數據庫等。

  • 安裝 Celery,並寫一個任務。

安裝 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 ,返回兩個數字的和。

  • 運行 woker,並調用任務。

運行 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'


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章