任務調度利器:Celery

Celery是Python開發的分佈式任務調度模塊,今天抽空看了一下,果然接口簡單,開發容易,5分鐘就寫出了一個異步發送郵件的服務。

Celery本身不含消息服務,它使用第三方消息服務來傳遞任務,目前,Celery支持的消息服務有RabbitMQ、Redis甚至是數據庫,當然Redis應該是最佳選擇。

安裝Celery

用pip或easy_install安裝:

$ sudo pip install Celery

或着:

$ sudo easy_install Celery

使用Redis作爲Broker時,再安裝一個celery-with-redis。

開始編寫tasks.py:

tasks.py

import time

from celery import Celery

celery = Celery('tasks', broker='redis://localhost:6379/0')

@celery.task

def sendmail(mail):

print('sending mail to %s...' % mail['to'])

time.sleep(2.0)

print('mail sent.')

然後啓動Celery處理任務:

$ celery -A tasks worker --loglevel=info

上面的命令行實際上啓動的是Worker,如果要放到後臺運行,可以扔給supervisor。

如何發送任務?非常簡單:

from tasks import sendmail

sendmail.delay(dict(to='[email protected]'))

可以看到,Celery的API設計真的非常簡單。

然後,在Worker裏就可以看到任務處理的消息:

[2013-08-27 19:20:23,363: WARNING/MainProcess] [email protected] ready.

[2013-08-27 19:20:23,367: INFO/MainProcess] consumer: Connected to redis://localhost:6379/0.

[2013-08-27 19:20:45,618: INFO/MainProcess] Got task from broker: tasks.sendmail[1a0a9262-7858-4192-9981-b7bf0ea7483b]

[2013-08-27 19:20:45,655: WARNING/PoolWorker-4] sending mail to [email protected]...

[2013-08-27 19:20:47,657: WARNING/PoolWorker-4] mail sent.

[2013-08-27 19:20:47,658: INFO/MainProcess] Task tasks.sendmail[1a0a9262-7858-4192-9981-b7bf0ea7483b] succeeded in 2.00266814232s: None

Celery默認設置就能滿足基本要求。Worker以Pool模式啓動,默認大小爲CPU核心數量,缺省序列化機制是pickle,但可以指定爲json。由於Python調用UNIX/Linux程序實在太容易,所以,用Celery作爲異步任務框架非常合適。

Celery還有一些高級用法,比如把多個任務組合成一個原子任務等,還有一個完善的監控接口,以後有空再繼續研究。

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