日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈 Celery 分布式队列

發(fā)布時(shí)間:2024/1/17 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈 Celery 分布式队列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

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.py
1
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.py
1
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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。