celery是python開發的分布式任務排程模組,今天抽空看了一下,果然介面簡單,開發容易,5分鐘就寫出了乙個非同步傳送郵件的服務。
celery本身不含訊息服務,它使用第三方訊息服務來傳遞任務,目前,celery支援的訊息服務有rabbitmq、redis甚至是資料庫,當然redis應該是最佳選擇。
用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
defsendmail
(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]'))
1a0a9262-7858-4192-9981-b7bf0ea7483b>
可以看到,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作為非同步任務框架非常合適。 Python celery 任務例項
coding utf 8 celery 任務示例 本地啟動celery命令 python manage.py celery worker settings settings 週期性任務還需要啟動celery排程命令 python manage.py celerybeat settings setti...
python Celery分布式任務佇列
celery是乙個簡單,靈活且可靠的分布式系統,可以處理大量訊息,同時為操作提供維護該系統所需的工具。這是乙個任務佇列,著重於實時處理,同時還支援任務排程。celery通過訊息進行通訊,通常使用 在客戶端和工作人員之間進行調解。為了啟動任務,客戶端將訊息新增到佇列中,然後 將訊息傳遞給工作人員 ce...
python celery學習筆記
專案中需要非同步執行某個任務,且失敗的時候需要重試,且需要知道是否執行成功,可以這樣設計。案例 如下 task def test task args,kwargs 處理邏輯 return truedef home request from celery tasks import test task ...