1. 程式人生 > >異步任務利器Celery(一)介紹

異步任務利器Celery(一)介紹

結果 imp 應用程序調用 ubuntu 方法 執行 .sql earch -s

django項目開發中遇到過一些問題,發送請求後服務器要進行一系列耗時非常長的操作,用戶要等待很久的時間。可不可以立刻對用戶返回響應,然後在後臺運行那些操作呢?

crontab定時任務很難達到這樣的要求 ,異步任務是很好的解決方法,有一個使用python寫的非常好用的異步任務工具Celery。

broker、worker和backend

Celery的架構由三部分組成,消息中間件(broker),任務執行單元(worker)和任務執行結果存儲(result backends)組成。

應用程序調用Celery的時候,會向broker傳遞消息,而後worker將會取到消息,對程序進行執行,backend用於存儲這些消息以及Celery執行的結果。

消息中間件broker

Celery本身不提供消息服務,但是可以方便的和第三方提供的消息中間件集成。

RabbitMQ是最好的消息中間件,使用方法如下:

Using RabbitMQ

Redis也是可行的,雖然有信息丟失的風險:

Using Redis

其余broker Broker Overview。

任務執行單元worker

Worker是Celery提供的任務執行的單元,worker並發的運行在分布式的系統節點中。

任務結果存儲backend

用來存儲Worker執行的任務的結果:SQLAlchemy/Django ORM, Memcached, Redis, RPC (RabbitMQ/AMQP)。

下載

下載Celery很簡單:

$ pip install celery

這裏使用Redis作為broker實踐一下,需要額外的庫支持,可以一起下載:

$ pip install -U "celery[redis]"

寫應用程序

寫一個簡單的應用tasks.py:

from celery import Celery

app = Celery(‘tasks‘, broker=‘redis://localhost:6379/0‘)

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

運行worker

在命令行中運行:

$ celery -A tasks worker --loglevel=info

輸出如下:

[2017-09-10 06:59:58,665: INFO/MainProcess] Connected to redis://localhost:6379/0
[2017-09-10 06:59:58,671: INFO/MainProcess] mingle: searching for neighbors
[2017-09-10 06:59:59,688: INFO/MainProcess] mingle: all alone
[2017-09-10 06:59:59,724: INFO/MainProcess] [email protected] ready.

發送任務

進入python環境:

>>> from tasks import add
>>> add.delay(4, 4)

worker裏就可以看到任務處理的消息:

[2017-09-10 07:02:34,874: INFO/MainProcess] Received task: task.add[40ec89c8-0a23-4a26-9da0-7f418c50f4cb]  
[2017-09-10 07:02:34,876: INFO/ForkPoolWorker-1] Task task.add[40ec89c8-0a23-4a26-9da0-7f418c50f4cb] succeeded in 0.000579041981837s: 8

存儲結果

使用Redis作為存儲backend,在tasks.py中修改:

app = Celery(‘tasks‘, backend=‘redis://localhost:6379/0‘, broker=‘redis://localhost:6379/0‘)

運行後就可以查看結果了:

>>> from task import add
>>> r=add.delay(3,4)
>>> r.result
7
>>> r.ready()
True
>>> r.get(timeout=1)
7

可以查看Redis中的存儲:

127.0.0.1:6379> get celery-task-meta-f2032d3e-f9a0-425d-bce4-f55ce58c8706
"{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": 7, \"task_id\": \"f2032d3e-f9a0-425d-bce4-f55ce58c8706\", \"children\": []}"
127.0.0.1:6379> 

超級簡單,想要對Celery做更進一步的了解,請參考官方文檔。

異步任務利器Celery(一)介紹