浅谈 Celery 分布式队列
?
Q1: Django開發Web項目時遇到一個問題,如何解決大量用戶在同一時間注冊,短信發送延遲的問題?
A1: ① 封裝一個發送短信的函數
② 創建進程、線程、協程調用發送短信的函數
?
Q2: 創建的進程、線程、協程和Django網站服務器在同一個電腦上,并且調用順序也是不確定的 所以A1 OUT
A2: Celery(異步任務隊列):
① celery中的任務發出者,中間人和任務執行著可以在不同的電腦上
② celery 中的任務會進行排序,先添加的任務先被worker執行
?
1. Celery的介紹
Celery是Python開發的分布式任務調度模塊,通過它我們可以輕松地實現任務的異步處理,Celery主要有以下幾個優點:
1.?它可以讓任務的執行同主程序完全脫離,甚至不在同一臺主機內。
2.?它通過隊列來調度任務,不用擔心并發量高時系統負載過大。
3. 它可以用來處理復雜系統性能問題,卻又相當靈活易用。
還是舉用戶注冊的例子,比如同一時間有100個用戶要注冊,此時網絡很差,請求到達短信系統的時間將會很長,如果短信系統遲遲無法回應,會導致后續的代碼無法執行,造成用戶長時間地等待,影響用戶的體驗;使用了Celery異步消息隊列,只要發布者將發送短信的任務送至中間件,后續無需做任何事情,worker會監聽任務隊列并執行。
在我的理解中 Celery主要有三大模塊組成:①? 任務發出者:發出執行的任務函數? ?② 任務執行者(worker):即執行任務的程序,可以有多個并發。它實時監控消息隊列,獲取隊列中調度的任務,并執行它? ?③ 中間人(broker):即任務調度隊列,它是一個生產者消費者模式的任務隊列,即任務發出者發出任務到任務隊列中,任務執行者從任務隊列中取出任務并執行,執行調度可以是順序調度也可以是計劃時間調度;Celery推薦的中間人(中間件)有RabbitMQ和Redis,本文使用的是Redis。
2. Celery的使用
2.1 安裝Celery
pip install celery?
2.2 目錄結構:
2.3 主要步驟:
1. 創建Celery對象并進行配置
# -- main.py1 from celery import Celery 2 3 # 創建celery應用 4 app = Celery('celery_name') 5 6 # 從conf.py中導入celery 配置 7 app.config_from_object('celery_tasks.conf') 8 9 # 自動注冊celery任務 10 app.autodiscover_tasks(['celery_tasks.sms'])
?
2. 定義任務函數(文件名必須為 tasks.py)
# --tasks.py1 from celery_tasks.main import app 2 3 @app.task(name='test_task') 4 def task(x, y): # 參數可不傳 5 print('%s,%s' % (x, y))
?
3. 啟動worker(celery? -A Celery對象包路徑 worker -l info)
>>> :celery -A celery_tasks.main worker -l info # (l:事件級別 info:打印信息)OUT :
-------------- celery@ubuntu v4.2.0 (windowlicker)
---- **** -----
--- * *** * -- Linux-4.4.0-31-generic-x86_64-with-Ubuntu-16.04-xenial 2018-07-04 19:09:40
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: celery_name:0x7f785faee518 # celery_name? 應用名
- ** ---------- .> transport: redis://127.0.0.1:6379/14 # 中間人地址
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 1 (prefork) # 啟動了幾個worker 默認cpu幾核啟動幾個
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. test_task # 任務名
[2018-07-04 19:09:40,913: INFO/MainProcess] Connected to redis://127.0.0.1:6379/14
[2018-07-04 19:09:40,930: INFO/MainProcess] mingle: searching for neighbors
[2018-07-04 19:09:41,960: INFO/MainProcess] mingle: all alone
[2018-07-04 19:09:42,016: INFO/MainProcess] celery@ubuntu ready.
4. 發送任務
>>> : task.delay('你好','Jaho')OUT :
[2018-07-04 19:15:14,413: INFO/MainProcess] Received task: test_task[81c86c98-1550-4d60-ab19-2e148d975b3d]
[2018-07-04 19:15:14,414: WARNING/ForkPoolWorker-1] 你好,Jaho
[2018-07-04 19:15:14,415: INFO/ForkPoolWorker-1] Task test_task[81c86c98-1550-4d60-ab19-2e148d975b3d] succeeded in 0.00043077800000901334s: None
?
3. 最后 Celery還有強大的定時任務功能還有使用RabbitMQ充當中間件的情況 后續將會繼續補充
?
轉載于:https://www.cnblogs.com/Jaho/p/9266157.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的浅谈 Celery 分布式队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: runloop - 介绍
- 下一篇: 1.3 安装Oracle遇到的问题-yu