一、celery簡介
Celery 是一個專注於實時處理和任務排程的分散式任務佇列, 同時提供操作和維護分散式系統所需的工具,任務就是訊息, 訊息中的有效載荷中包含要執行任務需要的全部資料.它是一個分散式佇列的管理工具, 可以用 Celery 提供的介面快速實現並管理一個分散式的任務佇列.
二、celery特性:
1.方便檢視定時任務的執行情況, 如 是否成功, 當前狀態, 執行任務花費的時間等.2.使用功能齊備的管理後臺或命令列新增,更新,刪除任務.3.方便把任務和配置管理相關聯.4.多程序, Eventlet 和 Gevent 三種模型併發執行.5.提供錯誤處理機制.6.提供多種任務原語, 方便實現任務分組,拆分,和呼叫鏈.7.支援多種訊息代理和儲存後端.8.Celery 是語言無關的.它提供了python 等常見語言的介面支援.三、celery相關元件:
Celery Beat : 任務排程器. Beat 程序會讀取配置檔案的內容, 週期性的將配置中到期需要執行的任務傳送給任務佇列.Celery Worker : 執行任務的消費者, 通常會在多臺伺服器執行多個消費者, 提高執行效率.Broker : 訊息代理, 佇列本身. 也稱為訊息中介軟體. 接受任務生產者傳送過來的任務訊息, 存進佇列再按序分發給任務消費方(通常是訊息佇列或者資料庫).Producer : 任務生產者. 呼叫 Celery API , 函式或者裝飾器, 而產生任務並交給任務佇列處理的都是任務生產者.Result Backend : 任務處理完成之後儲存狀態資訊和結果, 以供查詢.celery的架構圖如下:
四、celery支援的序列化
在客戶端和消費者之間傳輸資料需要 序列化和反序列化. Celery支援的序列化如下:
1.pickle:python標準庫的一個模組,支援python內建的資料結構,celery官方不推薦2.json:支援多種語言,可用於跨語言方案3.yaml:表達能力更強,支援的資料型別也比較多,但是效能方面稍遜json4.msgpack:二進位制的類json序列化方案,比json資料結構更小更快五、celery的簡單使用
1.使用redis作為broker和backend來演示一下celery的使用,首先啟動redis,使用db1作為broker和backend:
2.使用下面命令安裝celery的模組和redis模組:
pip install celery==4.1pip install redis==3.3.11
3.編寫tasks檔案:
# -*- coding: utf-8 -*-# @File : tasks.pyfrom __future__ import absolute_import, unicode_literalsfrom celery_tasks import celeryconfigfrom celery import Celeryapp = Celery('tasks', config_source=celeryconfig)@app.taskdef add(x, y): return x + y
配置檔案celeryconfig內容是:
# -*- coding: utf-8 -*-BROKER_URL = 'redis://:[email protected]:6379/1'CELERY_RESULT_BACKEND = 'rpc'CELERY_TASK_SERIALIZER = 'json'CELERY_RESULT_SERIALIZER = 'json'CELERY_TASK_RESULT_EXPIRES = 60*30CELERY_ACCEPT_CONTENT = ['json']CELERY_TIMEZONE = 'Asia/Shanghai'CELERY_TASK_PUBLISH_RETRY_POLICY = { 'max_retries': 3, 'interval_start': 0, 'interval_step': 0.2, 'interval_max': 0.2}# 佇列CELERY_QUEUES = { 'add': { 'routing_key': 'add' }}CELERY_ROUTES = { 'tasks.add': { 'queue': 'add', 'routing_key': 'add' }}
4.啟動celery:
使用命令celery -A celery_tasks.tasks worker --concurrency=2 --loglevel=debug進行啟動,concurrency是啟動work的數量,loglevel是日誌的級別:
redis中也有了值:
檢視一下啟動的worker:
看到會有三個程序,這時由於celery是master-worker的架構模式,一個主程序負責排程,然後多個從程序負責消費具體的任務,也就是排程器和工作程序。
5.對於 celery任務的使用
redis中也儲存了相關計算值:
六、配置檔案說明
1.BROKER_URL:broker地址2.CELERY_RESULT_BACKEND:結果儲存地址3.CELERY_TASK_SERIALIZER:任務序列化方式4.CELERY_RESULT_SERIALIZER:結果序列化方式5.CELERY_TASK_RESULT_EXPIRES:任務過期時間6.CELERY_ACCEPT_CONTENT:指定任務接受的內容型別7.CELERY_TASK_PUBLISH_RETRY_POLICY:任務釋出策略8.CELERY_QUEUES:佇列配置9.CELERY_ROUTES:路由設定
七、任務狀態回撥:
1.PENDING:任務等待中2.STARTED:任務已開始3.SUCCESS:任務成功4.FAILURE:任務失敗5.RETRY:任務重試6.REVOKED:任務取消7.PROGRESS:任務進行中