前言
celery是一個基於python開發的簡單、靈活且可靠的分佈式任務隊列框架, 是一個分佈式隊列的管理工具, 可以用 Celery 提供的接口快速實現並管理一個分佈式的任務隊列.。它採用了典型的生產者-消費者模型,主要由三部分組成:
-
消息隊列broker:broker實際上就是一個MQ隊列服務,可以使用Redis、RabbitMQ等作爲broker;
-
處理任務的消費者workers:broker通知worker隊列中有任務,worker去隊列中取出任務執行,每一個worker就是一個進程;
-
存儲結果的backend:執行結果存儲在backend,默認也會存儲在broker使用的MQ隊列服務中,也可以單獨配置用何種服務做backend;
celery安裝
pip install celery
celery 簡單運行
創建文件
安裝完成後在自己的APP下創建一個tasks.py文件,名字最好就是tasks,不要隨意更改,有多個app則每個app下都可以創建一個task.py(前提是有需要的話)目錄結構如下,本文已django爲例:
my_demo
|--func_app
|-- admin.py
|-- apps.py
|-- __init__.py
|-- models.py
|-- tasks.py
|-- tests.py
|-- urls.py
|-- views.py
|--my_demo
|-- celery.py
|-- __init__.py
|-- settings.py
|-- urls.py
|-- wsgi.py
tasks.py
from celery import Celery
app = Celery('tasks', broker='redis://:password@host:port/database_num',backend='redis://:password@host:port/database_num')
#第一個次數‘tasks’是當前模塊的名字,第二個參數是broker代理的url,這裏選用了redis
第一個參數 ‘tasks’ 是當前模塊的名字,第二個參數是消息隊列broker的url,第三個參數是存放結果的backend,這裏都選用了redis(也可以是RabbitMQ)。
編寫第一段celery代碼
tasks.py
from celery import Celery
app = Celery('tasks', broker='redis://:password@host:port/database_num',backend='redis://:password@host:port/database_num')
@app.task
def add(x, y):
return x + y
if __name__ == '__main__':
res = add.delay(3,4)
print(res.result)#打印結果
定義一個簡單的add函數,使用delay()方法進行調用,res.result 返回celery計算的結果,先不要急着運行,這樣肯定運行不成功的。
爲運行程序準備環境(已經具備了可跳過)
接下來我們去坐準備工作,一般我們的服務都會部署到linux服務器上,假設你現在已經有一臺自己的服務器,那麼請使用SecureCRT或者putty連接上機器,還是先安裝redis和celery,快捷安裝如下:
Redis安裝-------10分鐘安裝配置Redis
pip install celery
創建一個目錄專門用於執行celery程序(位置隨你高興),再創建一個tasks.py:
mkdir celery_code#創建目錄
cd celery_code#進入目錄下面
touch tasks.py #創建tasks.py文件,功能與剛纔上面的一樣
vi tasks.py #打開文件
運行celery
vi tasks.py 後按下鍵盤上的i鍵,複製剛纔的代碼粘貼進這個文件,按下ESC,SHIFT+:,輸入wq保存退出,分別輸入以下命令。
chmod +x tasks.py #給tasks.py賦予可執行權限
celery -A tasks worker --loglevel=info ##運行celery
如果順利的話,你將看到如下界面:
運行程序
忽略最後一行,這就代表啓動成功了,接着你可以在你的window開發環境上運行程序了,運行後應該能看到如下:
Linux:
可以清楚的看到celery在Received到task後很快woker就開始工作,返回了tasks.add執行success,tasks即我們的模塊名稱,add爲我們定義的方法名,success代表執行成功,後面的一串小數即爲執行的時間,7爲我們想要的執行結果。
Windows:
而我們pycharm下同樣也返回了結果7,執行成功!!!
後續
這時如果你有興趣的話可以登錄redis查看broker和backend:
redis-cli #連接redis客戶端
select database_num #爲你在前面配置的worker和backend的數據庫編號
keys * #查看執行過的任務編號
仔細查看最後標紅的一行,如果與前面運行程序中的celery結果圖對比就會發現,後面的編號其實是一樣的,可以斷定這就是我們剛纔運行的任務編號,這時就可以根據這個key查詢celery返回的信息。
截圖可能不太清晰,但依然能看到狀態status是success,result是7,task_id是上圖標紅的那串。
結束
本文介紹了怎麼安裝運行celery,當然本文中所使用的的add函數是極爲簡單的,後續將更新配置文件化和較常用的celery發送郵件、celery定時任務,更多內容請點擊從今天開始種樹。