celery的簡單使用

Celery

Celery是一個功能完備即插即用的異步任務(wù)隊列系統(tǒng)杆煞。它適用于異步處理問題,當(dāng)發(fā)送郵件蘑险、或者文件上傳, 圖像處理等等一些比較耗時的操作滴肿,我們可將其異步執(zhí)行,這樣用戶不需要等待很久佃迄,提高用戶體驗泼差。

文檔:http://docs.jinkan.org/docs/celery/getting-started/index.html

Celery的特點是:

  • 簡單,易于使用和維護(hù)呵俏,有豐富的文檔堆缘。
  • 高效,單個celery進(jìn)程每分鐘可以處理數(shù)百萬個任務(wù)普碎。
  • 靈活吼肥,celery中幾乎每個部分都可以自定義擴(kuò)展。
任務(wù)隊列是一種跨線程麻车、跨機(jī)器工作的一種機(jī)制.
任務(wù)隊列中包含稱作任務(wù)的工作單元缀皱。有專門的工作進(jìn)程持續(xù)不斷的監(jiān)視任務(wù)隊列,并從中獲得新的任務(wù)并處理.
celery通過消息進(jìn)行通信动猬,通常使用一個叫Broker(中間人)來協(xié)client(任務(wù)的發(fā)出者)和worker(任務(wù)的處理者). clients發(fā)出消息到隊列中啤斗,broker將隊列中的信息派發(fā)給worker來處理。

Celery的架構(gòu)

Celery的架構(gòu)由三部分組成赁咙,消息隊列(message broker)钮莲,任務(wù)執(zhí)行單元(worker)和任務(wù)執(zhí)行結(jié)果存儲(task result store)組成。

image.png
一個celery系統(tǒng)可以包含很多的worker和broker

Celery本身不提供消息隊列功能彼水,但是可以很方便地和第三方提供的消息中間件進(jìn)行集成崔拥,包括RabbitMQ,Redis,MongoDB等

安裝

pip install -U celery

也可從官方直接下載安裝包:https://pypi.python.org/pypi/celery/

tar xvfz celery-0.0.0.tar.gz
cd celery-0.0.0
python setup.py build
python setup.py install

使用

使用celery第一件要做的最為重要的事情是需要先創(chuàng)建一個Celery實例,一般叫做celery應(yīng)用猿涨,或者更簡單直接叫做一個app握童。app應(yīng)用是使用celery所有功能的入口姆怪,比如創(chuàng)建任務(wù)叛赚,管理任務(wù)等,在使用celery的時候稽揭,app必須能夠被其他的模塊導(dǎo)入俺附。

一般celery任務(wù)目錄直接放在項目的根目錄下即可,路徑:

api/
├── mycelery/
    ├── config.py     # 配置文件
    ├── __init__.py   
    ├── main.py       # 主程序
    └── sms/          # 一個目錄可以放置多個任務(wù),該目錄下存放當(dāng)前任務(wù)執(zhí)行時需要的模塊或依賴
        └── tasks.py  # 任務(wù)的文件溪掀,名稱必須是這個!!!

main.py事镣,代碼:

# 主程序
from celery import Celery
# 創(chuàng)建celery實例對象
app = Celery("xxx")

# 通過app對象加載配置
app.config_from_object("mycelery.config")

# 自動搜索并加載任務(wù)
# 參數(shù)必須必須是一個列表,里面的每一個任務(wù)都是任務(wù)的路徑名稱
# app.autodiscover_tasks(["任務(wù)1","任務(wù)2",....])
app.autodiscover_tasks(["mycelery.sms","mycelery.cache"])

# 啟動Celery的命令
# 強(qiáng)烈建議切換目錄到項目的根目錄下啟動celery!!
# celery -A mycelery.main worker --loglevel=info

配置文件config.py揪胃,代碼:

# 任務(wù)隊列的鏈接地址
broker_url = 'redis://127.0.0.1:6379/15'
# 結(jié)果隊列的鏈接地址
result_backend = 'redis://127.0.0.1:6379/14'

創(chuàng)建一個任務(wù)文件sms/tasks.py璃哟,并創(chuàng)建任務(wù)氛琢,代碼:

# celery的任務(wù)必須寫在tasks.py的文件中,別的文件名稱不識別!!!
from mycelery.main import app

@app.task  # name表示設(shè)置任務(wù)的名稱随闪,如果不填寫阳似,則默認(rèn)使用函數(shù)名做為任務(wù)名
def send_sms():
    print("發(fā)送短信!!!")

@app.task(name="send_sms2")  # name表示設(shè)置任務(wù)的名稱,如果不填寫铐伴,則默認(rèn)使用函數(shù)名做為任務(wù)名
def send_sms2():
    print("發(fā)送短信任務(wù)2!!!")

接下來撮奏,運(yùn)行celery,效果如下:

image.png

在程序中調(diào)用上面的異步任務(wù)当宴,拿django進(jìn)行舉例:

# 調(diào)用celery執(zhí)行異步任務(wù)
from my_celery.sms.tasks import send_sms
send_sms.delay(mobile)

其他參考文檔:

http://docs.celeryproject.org/en/latest/getting-started/introduction.html

https://github.com/celery/celery/tree/master/examples/django/

http://www.reibang.com/p/1840035cb510

https://flower.readthedocs.io/en/latest/screenshots.html

把celery和django組合起來一起使用畜吊。

django和celery進(jìn)行組合

在main.py主程序中對django的配置文件進(jìn)行加載

# 主程序
import os
from celery import Celery
# 創(chuàng)建celery實例對象
app = Celery("xxx")

# 把celery和django進(jìn)行組合,識別和加載django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api.settings.dev')

# 對django框架執(zhí)行初始化
import django
django.setup()

# 通過app對象加載配置
app.config_from_object("mycelery.config")

# 加載任務(wù)
# 參數(shù)必須必須是一個列表户矢,里面的每一個任務(wù)都是任務(wù)的路徑名稱
# app.autodiscover_tasks(["任務(wù)1","任務(wù)2"])
app.autodiscover_tasks(["mycelery.sms","mycelery.cache"])

# 啟動Celery的命令
# 強(qiáng)烈建議切換目錄到mycelery根目錄下啟動
#  celery -A mycelery.main worker --loglevel=info

在需要使用django配置的任務(wù)中玲献,直接加載配置,把注冊的短信發(fā)送功能梯浪,整合成一個任務(wù)函數(shù)青自,代碼:

from my_celery.main import app
from .yuntongxun.sms import CCP
from luffyapi.settings import constants
import logging

log = logging.getLogger("django")

# @app.task(name="send_sms")
# def send_sms(mobile):
#     print("發(fā)送短信給%s的異步任務(wù)執(zhí)行了" % mobile)
#     return "任務(wù)結(jié)果!"


@app.task(name="send_sms")
def send_sms(mobile, sms_code):
    """異步發(fā)送短信"""
    ccp = CCP()
    try:
        result = ccp.send_template_sms(mobile, [sms_code, constants.SMS_EXPIRE_TIME//60 ], constants.SMS_TEMPLATE_ID)
        return result
    except:
        log.error("發(fā)送短信驗證碼失斍ぁ延窜!手機(jī)號:%s" % mobile)

在這個任務(wù)中,需要加載短信發(fā)送的sdk和相關(guān)的配置常量抹锄,所以可以直接把django中的短信發(fā)送模塊和相關(guān)的常量配置文件直接剪切到當(dāng)前sms任務(wù)目錄中

mycelery/
├── config.py
├── __init__.py
├── main.py
└── sms/
    ├── constant.py
    ├── __init__.py
    ├── tasks.py
    └── yuntongxun
        ├── CCPRestSDK.py
        ├── __init__.py
        ├── sms.py
        └── xmltojson.py

再次啟動項目即可逆瑞。

最終在django里面調(diào)用Celery來異步執(zhí)行任務(wù)。需要完成2個步驟:

# 1. 聲明一個和celery一模一樣的任務(wù)函數(shù)伙单,導(dǎo)包來解決
from mycelery.sms.tasks import send_sms

# 2. 調(diào)用任務(wù)函數(shù)获高,發(fā)布任務(wù)
send_sms.delay(mobile,code)
# send_sms.delay() 如果調(diào)用的任務(wù)函數(shù)沒有參數(shù),則不需要填寫任何內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吻育,一起剝皮案震驚了整個濱河市念秧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌布疼,老刑警劉巖摊趾,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異游两,居然都是意外死亡砾层,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門贱案,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肛炮,“玉大人,你說我怎么就攤上這事∏仍悖” “怎么了碍扔?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秕重。 經(jīng)常有香客問我蕴忆,道長,這世上最難降的妖魔是什么悲幅? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任套鹅,我火速辦了婚禮,結(jié)果婚禮上汰具,老公的妹妹穿的比我還像新娘卓鹿。我一直安慰自己,他們只是感情好留荔,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布吟孙。 她就那樣靜靜地躺著,像睡著了一般聚蝶。 火紅的嫁衣襯著肌膚如雪杰妓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天碘勉,我揣著相機(jī)與錄音巷挥,去河邊找鬼。 笑死验靡,一個胖子當(dāng)著我的面吹牛倍宾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胜嗓,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼高职,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辞州?” 一聲冷哼從身側(cè)響起怔锌,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎变过,沒想到半個月后埃元,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡牵啦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年亚情,在試婚紗的時候發(fā)現(xiàn)自己被綠了妄痪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哈雏。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裳瘪,到底是詐尸還是另有隱情土浸,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布彭羹,位于F島的核電站黄伊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏派殷。R本人自食惡果不足惜还最,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毡惜。 院中可真熱鬧拓轻,春花似錦、人聲如沸经伙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帕膜。三九已至枣氧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垮刹,已是汗流浹背达吞。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留荒典,地道東北人宗挥。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像种蝶,于是被迫代替她去往敵國和親契耿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355