天天看點

任務排程利器:Celerytasks.py

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還有一些進階用法,比如把多個任務組合成一個原子任務等,還有一個完善的監控接口,以後有空再繼續研究。