繼續嘗試沒有時間弄明白的技術。html
celery官方文檔地址:http://docs.celeryproject.org/en/stable/getting-started/introduction.html#get-started。python
IBM描述參考地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-celery-web-service/index.html?ca=drs-&utm_source=tuicool&utm_medium=referral#authorN10015web
簡單的說,能夠理解celery是幫助你把一些指定的工做異步化,不用等待io的工具。redis
好比要發十條短信,須要10秒。若是線性操做,就得等待到短信所有發送完畢以後,再開始執行下面的代碼,若是中間某一個死了,你的用戶就會呆呆的等待,直到操做超時,這種體驗是很是糟糕。若是再amazon買過書都知道,當你在付款完畢以後,立刻跳轉回來去看你的支付結果,這個時候可能狀態還並未作刷新。由於你的付款操做錢雖然打出去了,實際上還在輪流排隊支付,這個時候你能夠出去刷個微博,而後再回來看你的付款狀況,多半都已經會顯示支付完畢了這就是異步的好處。數據庫
而celery就是爲了解決這種問題存在的。ubuntu
之前一直沒法理解這種系統存在的意義和中間人broker扮演的關係。實際上,celery本身就是一個隊列系統,可是同時她又沒法將存儲在隊列的消息通知任何人,她須要一箇中間人幫忙作這個事情,redis,rabbitmq就作了這個消息傳遞的中間人。因此處理流程是這樣,當咱們生產了一個消息,celery將消息放入隊列而且中間人redis拿到消息以後將消息拿給空閒的worker進行處理。當咱們產生一個異步消息的時候,就是把這個處理放到隊列中去排隊,最後由worker進行執行。而放這個消息的人並不會等待,會直接返回。而這邊消息隊列的消息處理完畢以後會以回調的形式回傳給發送消息的人。固然這個回調一樣有兩種方式,用rpc存數據庫什麼的都是能夠的。服務器
這篇文章的重點並不在如何使用上,而是在記錄配置上面,關於如何具體使用的流程,IBM那哥們的文章寫得很是清楚。app
首先在ubuntu上異步
pip install celery # 安裝celery
而後安裝redis的python客戶端函數
pip install redis # 安裝redis客戶端
而後在ubuntu服務器上安裝redis數據庫
apt-get install redis
而後開始配置celery運行。這裏我使用celery的默認配置來跑celery以簡化步驟
首先建立一個tasks.py的python腳本,這個腳本里 帶着一個會被髮送到celery執行的異步任務函數。
from celery import Celery app = Celery('tasks', broker='redis://localhost') @app.task def hello(): return 'hello world'
這裏注意,若是你的redis是用密碼的 broker的格式就會是這樣
app = Celery('tasks', broker='redis://:password@localhost')
否則會鏈接失敗。
而後使用一個worker監視這個任務是否被調用。
celery -A tasks worker
-A是指明app名字的意思。
這個時候成功會出現這樣的狀況
當你看到celery@xxxx ready的時候 就是你的監控woker啓動起來了。這個界面是woker的一個控制檯。
以後能夠寫一個調用生產消息。這裏我從新寫一個腳本而且調用上面的hello函數。
from tasks import add def notify(a, b): result = add.delay(a, b) return result if __name__ == '__main__': print notify(6, 7)
這裏調用的add.delay(a, b)會返回一個task的惟一id,若是咱們設了backend 那麼咱們能夠拿着這個返回的惟一id異步取得這個值。
這個將在下篇文章詳細介紹。