關於celery的定義,首先來看官方網站:Celery(芹菜) 是一個簡單、靈活且可靠的,處理大量消息的分佈式系統,而且提供維護這樣一個系統的必需工具。html
簡單來看,是一個基於python開發的分佈式異步消息任務隊列,持使用任務隊列的方式在分佈的機器、進程、線程上執行任務調度。經過它能夠輕鬆的實現任務的異步處理, 若是你的業務場景中須要用到異步任務,就能夠考慮使用celery, 舉幾個實例場景中可用的例子:python
Celery 在執行任務時須要經過一箇中間人(消息中間件)來接收和發送任務消息,以及存儲任務結果,完整的中間人列表請查閱官方網站redis
PS:任務隊列是一種在線程或機器間分發任務的機制。架構
PS:消息隊列的輸入是工做的一個單元,稱爲任務,獨立的工做(Worker)進程持續監視隊列中是否有須要處理的新任務。 併發
Celery 系統可包含多個職程和中間人,以此得到高可用性和橫向擴展能力,其基本架構由三部分組成,消息中間件(message broker),任務執行單元(worker)和任務執行結果存儲(task result store)組成。app
Celery的主要特色:異步
一、用戶應用程序講任務經過celery放入Broker中。分佈式
二、多個worker經過Broker獲取任務並執行。工具
三、worker執行完成後,會把任務的結果、狀態等信息返回到Broker中存儲,供用戶程序讀取。網站
PS:Celery 用消息通訊,一般使用中間人(Broker)在客戶端和職程間斡旋。這個過程從客戶端向隊列添加消息開始,以後中間人把消息派送給職程。
# 利用pip3命令安裝celery模塊
pip3 install celery
from celery import Celery app = Celery('task', # 是當前模塊的名稱,這個參數是必須的,這樣的話名稱能夠自動生成 broker="redis://192.168.100.83:6379/0", # 中間人的地址 backend="redis://192.168.100.83:6379/1" # 結果數據存放地址 ) @app.task # 使用celery標識一個任務,多個任務都須要使用該裝飾器 def add(x,y): return x+y
其餘中間件
1 # rabbitmq 2 broker = 'amqp://user:password@ip:5672//' 3 4 # redis 5 broker = 'redis://passwordf@ip:6379/db'
運行一個worker
elery -A task worker --loglevel=debug # -A參數表示的是Celery APP的名稱,task就是APP的名稱(應用文件名) # worker表示是一個執行任務角色 # loglevel=info記錄日誌類型默認是info
生產者
form ling import add re = add.delay(10, 20) print(re.result) #獲取結果 print(re.ready) #是否處理 print(re.get(timeout=1)) #獲取結果 print(re.status) #是否處理