浅谈 Celery 分布式队列
?
Q1: Django開發(fā)Web項(xiàng)目時(shí)遇到一個(gè)問題,如何解決大量用戶在同一時(shí)間注冊(cè),短信發(fā)送延遲的問題?
A1: ① 封裝一個(gè)發(fā)送短信的函數(shù)
② 創(chuàng)建進(jìn)程、線程、協(xié)程調(diào)用發(fā)送短信的函數(shù)
?
Q2: 創(chuàng)建的進(jìn)程、線程、協(xié)程和Django網(wǎng)站服務(wù)器在同一個(gè)電腦上,并且調(diào)用順序也是不確定的 所以A1 OUT
A2: Celery(異步任務(wù)隊(duì)列):
① celery中的任務(wù)發(fā)出者,中間人和任務(wù)執(zhí)行著可以在不同的電腦上
② celery 中的任務(wù)會(huì)進(jìn)行排序,先添加的任務(wù)先被worker執(zhí)行
?
1. Celery的介紹
Celery是Python開發(fā)的分布式任務(wù)調(diào)度模塊,通過它我們可以輕松地實(shí)現(xiàn)任務(wù)的異步處理,Celery主要有以下幾個(gè)優(yōu)點(diǎn):
1.?它可以讓任務(wù)的執(zhí)行同主程序完全脫離,甚至不在同一臺(tái)主機(jī)內(nèi)。
2.?它通過隊(duì)列來調(diào)度任務(wù),不用擔(dān)心并發(fā)量高時(shí)系統(tǒng)負(fù)載過大。
3. 它可以用來處理復(fù)雜系統(tǒng)性能問題,卻又相當(dāng)靈活易用。
還是舉用戶注冊(cè)的例子,比如同一時(shí)間有100個(gè)用戶要注冊(cè),此時(shí)網(wǎng)絡(luò)很差,請(qǐng)求到達(dá)短信系統(tǒng)的時(shí)間將會(huì)很長,如果短信系統(tǒng)遲遲無法回應(yīng),會(huì)導(dǎo)致后續(xù)的代碼無法執(zhí)行,造成用戶長時(shí)間地等待,影響用戶的體驗(yàn);使用了Celery異步消息隊(duì)列,只要發(fā)布者將發(fā)送短信的任務(wù)送至中間件,后續(xù)無需做任何事情,worker會(huì)監(jiān)聽任務(wù)隊(duì)列并執(zhí)行。
在我的理解中 Celery主要有三大模塊組成:①? 任務(wù)發(fā)出者:發(fā)出執(zhí)行的任務(wù)函數(shù)? ?② 任務(wù)執(zhí)行者(worker):即執(zhí)行任務(wù)的程序,可以有多個(gè)并發(fā)。它實(shí)時(shí)監(jiān)控消息隊(duì)列,獲取隊(duì)列中調(diào)度的任務(wù),并執(zhí)行它? ?③ 中間人(broker):即任務(wù)調(diào)度隊(duì)列,它是一個(gè)生產(chǎn)者消費(fèi)者模式的任務(wù)隊(duì)列,即任務(wù)發(fā)出者發(fā)出任務(wù)到任務(wù)隊(duì)列中,任務(wù)執(zhí)行者從任務(wù)隊(duì)列中取出任務(wù)并執(zhí)行,執(zhí)行調(diào)度可以是順序調(diào)度也可以是計(jì)劃時(shí)間調(diào)度;Celery推薦的中間人(中間件)有RabbitMQ和Redis,本文使用的是Redis。
2. Celery的使用
2.1 安裝Celery
pip install celery?
2.2 目錄結(jié)構(gòu):
2.3 主要步驟:
1. 創(chuàng)建Celery對(duì)象并進(jìn)行配置
# -- main.py1 from celery import Celery 2 3 # 創(chuàng)建celery應(yīng)用 4 app = Celery('celery_name') 5 6 # 從conf.py中導(dǎo)入celery 配置 7 app.config_from_object('celery_tasks.conf') 8 9 # 自動(dòng)注冊(cè)celery任務(wù) 10 app.autodiscover_tasks(['celery_tasks.sms'])
?
2. 定義任務(wù)函數(shù)(文件名必須為 tasks.py)
# --tasks.py1 from celery_tasks.main import app 2 3 @app.task(name='test_task') 4 def task(x, y): # 參數(shù)可不傳 5 print('%s,%s' % (x, y))
?
3. 啟動(dòng)worker(celery? -A Celery對(duì)象包路徑 worker -l info)
>>> :celery -A celery_tasks.main worker -l info # (l:事件級(jí)別 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? 應(yīng)用名
- ** ---------- .> transport: redis://127.0.0.1:6379/14 # 中間人地址
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 1 (prefork) # 啟動(dòng)了幾個(gè)worker 默認(rèn)cpu幾核啟動(dòng)幾個(gè)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. test_task # 任務(wù)名
[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. 發(fā)送任務(wù)
>>> : 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還有強(qiáng)大的定時(shí)任務(wù)功能還有使用RabbitMQ充當(dāng)中間件的情況 后續(xù)將會(huì)繼續(xù)補(bǔ)充
?
轉(zhuǎn)載于:https://www.cnblogs.com/Jaho/p/9266157.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的浅谈 Celery 分布式队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: runloop - 介绍
- 下一篇: 1.3 安装Oracle遇到的问题-yu