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