隨筆-celery

在程序運行過程中,要執(zhí)行一個很久的任務想罕,但是我們又不想主程序被阻塞悠栓,常見的方法是多線程“醇郏可是當并發(fā)量過大時惭适,多線程也會扛不住,必須要用線程池來限制并發(fā)個數(shù)楼镐,而且多線程對共享資源的使用也是很麻煩的事情癞志。還有就是前面幾篇介紹過的協(xié)程,但是協(xié)程畢竟還是在同一線程內(nèi)執(zhí)行的框产,如果一個任務本身就要執(zhí)行很長時間凄杯,而不是因為等待IO被掛起,那其他協(xié)程照樣無法得到運行秉宿。本文要介紹一個強大的分布式任務隊列Celery戒突,它可以讓任務的執(zhí)行同主程序完全脫離,甚至不在同一臺主機內(nèi)描睦。它通過隊列來調(diào)度任務膊存,不用擔心并發(fā)量高時系統(tǒng)負載過大。它可以用來處理復雜系統(tǒng)性能問題酌摇,卻又相當靈活易用膝舅。

架構(gòu)組成:

參考引用:http://www.bjhee.com/celery.html

一個完整的Celery分布式隊列架構(gòu)應該包含一下幾個模塊:
  1. 消息中間人 Broker
    消息中間人嗡载,就是任務調(diào)度隊列窑多,通常以獨立服務形式出現(xiàn)。它是一個生產(chǎn)者消費者模式洼滚,即主程序?qū)⑷蝿辗湃腙犃兄泄∠ⅲ笈_職程則會從隊列中取出任務并執(zhí)行。任務可以按順序調(diào)度,也可以按計劃時間調(diào)度千康。Celery組件本身并不提供隊列服務享幽,你需要集成第三方消息中間件。Celery推薦的有RabbitMQ和Redis拾弃,另外也支持MongoDB值桩、SQLAlchemy、Memcached等豪椿,但不推薦奔坟。
  2. 任務執(zhí)行單元 Worker,也叫職程
    即執(zhí)行任務的程序搭盾,可以有多個并發(fā)咳秉。它實時監(jiān)控消息隊列,獲取隊列中調(diào)度的任務鸯隅,并執(zhí)行它澜建。
  3. 執(zhí)行結(jié)果存儲 Backend
    由于任務的執(zhí)行同主程序分開,如果主程序想獲取任務執(zhí)行的結(jié)果蝌以,就必須通過中間件存儲炕舵。同消息中間人一樣,存儲也可以使用RabbitMQ跟畅、Redis幕侠、MongoDB、SQLAlchemy碍彭、Memcached等晤硕,建議使用帶持久化功能的存儲中間件。(另外庇忌,并非所有的任務執(zhí)行都需要保存結(jié)果舞箍,這個模塊可以不配置。)
安裝CELERY

pip install celery
pip install django=celery=3.x.x
備注:經(jīng)過搜索發(fā)現(xiàn)是因為winsows是不支持celery4的皆疹。參照的回答在這https://github.com/celery/celery/issues/3551

Framework Integration
Django django-celery
Pyramid pyramid_celery
Pylons celery-pylons
Flask not needed
web2py web2py-celery
Tornado tornado-celery

為了支持redis

pip install 'celery[redis]'

help:

celery help
celery worker --help

  • 然后疏橄,我們編寫任務代碼TASKS.PY
from celery import Celery
 
app = Celery('tasks',
             broker='amqp://guest@localhost//',
             backend='redis://localhost:6379/0')
 
@app.task
def add(x, y):
    return x + y
啟動后臺職程

職程會監(jiān)聽消息中間人隊列并等待任務調(diào)度,啟動命令為:

$ celery worker -A tasks --loglevel=info --concurrency=5

解釋:

  • 參數(shù)”-A”指定了Celery實例的位置略就,更建議你指定Celery對象名稱捎迫,如”-A tasks.app”。
  • 參數(shù)”loglevel”指定了日志等級表牢,也可以不加窄绒,默認為warning。
  • 參數(shù)”concurrency”指定最大并發(fā)數(shù)崔兴,默認為CPU核數(shù)彰导。
輸入指令:
  • 任務發(fā)送到消息中間人隊列
>>> from tasks import add
>>> add.delay(2, 5)
<AsyncResult: 4c079d93-fd5f-47f0-8b93-c77a0112eb4e>

這個”delay()”方法會將任務發(fā)送到消息中間人隊列蛔翅,并由之前啟動的后臺職程來執(zhí)行。所以這時Python控制臺上只會返回”AsyncResult”信息位谋。如果你看下之前職程的啟動窗口山析,你會看到多了條日志”Task tasks.add[4c079d93-fd5f-47f0-8b93-c77a0112eb4e] succeeded in 0.0211374238133s: 7″。說明”add”任務已經(jīng)被調(diào)度并執(zhí)行成功掏父,并且返回7笋轨。

  • 配置了后臺結(jié)果存儲(backend),我們可以通過如下方法獲取任務執(zhí)行后的返回值:
>>> result=add.delay(2, 5)
>>> result.ready()
True
>>> result.get(timeout=1)
7
  • 關于并發(fā)

任務的并發(fā)默認采用多進程方式赊淑,Celery也支持gevent或者eventlet協(xié)程并發(fā)翩腐。方法是在啟動職程時使用”-P”參數(shù):

celery worker -A tasks --loglevel=info -P gevent -c 100

通過”-P gevent”我們就將并發(fā)改為了gevent方式了;”-c 100″同之前介紹的”concurrency”參數(shù)膏燃,指定了并發(fā)個數(shù)茂卦。

  • 關于后臺

配置了Redis存儲,那讓我們?nèi)edis里看看Celery任務執(zhí)行的結(jié)果是怎么存儲的吧组哩。通過”keys celery*”等龙,可以查到所有屬于celery的鍵值.

一條記錄詳細內(nèi)容是:

#JSon序列化存在Redis:
"{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": 7, \"task_id\": \"4c079d93-fd5f-47f0-8b93-c77a0112eb4e\", \"children\": []}"
關于配置 : 三種方式可供選擇
  1. 單個參數(shù)配置
app.conf.CELERY_BROKER_URL = 'amqp://guest@localhost//'
app.conf.CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
  1. 多個參數(shù)配置
app.conf.update(
    CELERY_BROKER_URL = 'amqp://guest@localhost//',
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
)
  1. 從配置文件中獲取
先將配置項放入配置文件中,如”celeryconfig.py”
BROKER_URL='amqp://guest@localhost//'
CELERY_RESULT_BACKEND='redis://localhost:6379/0'
然后導入到celery對象中:
app.config_from_object('celeryconfig')

資料參考:
https://blog.csdn.net/yeyingcai/article/details/78647553(很容易懂)
http://www.reibang.com/p/b7f843f21c46
http://www.reibang.com/p/f1f2cd1cd491(實踐例子)
https://blog.csdn.net/weixin_43688726/article/details/89242366

from future import absolute_import : 在 3.0 以前的舊版本中啟用相對導入等特性所必須的 future 語句伶贰。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛛砰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子黍衙,更是在濱河造成了極大的恐慌泥畅,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琅翻,死亡現(xiàn)場離奇詭異位仁,居然都是意外死亡,警方通過查閱死者的電腦和手機方椎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門聂抢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棠众,你說我怎么就攤上這事琳疏。” “怎么了闸拿?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵空盼,是天一觀的道長。 經(jīng)常有香客問我新荤,道長揽趾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任迟隅,我火速辦了婚禮但骨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘智袭。我一直安慰自己奔缠,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布吼野。 她就那樣靜靜地躺著校哎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞳步。 梳的紋絲不亂的頭發(fā)上闷哆,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音单起,去河邊找鬼抱怔。 笑死,一個胖子當著我的面吹牛嘀倒,可吹牛的內(nèi)容都是我干的屈留。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼测蘑,長吁一口氣:“原來是場噩夢啊……” “哼灌危!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碳胳,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勇蝙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挨约,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體味混,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年诫惭,在試婚紗的時候發(fā)現(xiàn)自己被綠了惜傲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡贝攒,死狀恐怖盗誊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隘弊,我是刑警寧澤哈踱,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站梨熙,受9級特大地震影響开镣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咽扇,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一邪财、第九天 我趴在偏房一處隱蔽的房頂上張望陕壹。 院中可真熱鬧,春花似錦树埠、人聲如沸糠馆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽又碌。三九已至,卻和暖如春绊袋,著一層夾襖步出監(jiān)牢的瞬間毕匀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工癌别, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留皂岔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓展姐,卻偏偏與公主長得像凤薛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诞仓,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在學習Celery之前缤苫,我先簡單的去了解了一下什么是生產(chǎn)者消費者模式。 生產(chǎn)者消費者模式 在實際的軟件開發(fā)過程中墅拭,...
    c2db9ba35639閱讀 3,530評論 0 8
  • 一. celery 簡介 Celery 是一個專注于實時處理和任務調(diào)度的分布式任務隊列, 同時提供操作和維護分布式...
    dinel閱讀 5,940評論 0 2
  • 前面用三篇文章斷斷續(xù)續(xù)寫了Celery+RabbitMQ相關的文章活玲。爬蟲架構(gòu)|Celery+RabbitMQ快速入...
    小怪聊職場閱讀 7,238評論 0 39
  • celery的簡介 ??celery是一個基于分布式消息傳輸?shù)漠惒饺蝿贞犃校鼘W⒂趯崟r處理谍婉,同時也支持任務調(diào)度舒憾。...
    山陰少年閱讀 10,824評論 0 11
  • 今天早上在上班的途中,一直回顧自己昨天給女兒的信文以及和愛人一路走來的艱辛穗熬,讓我悍然落淚镀迂。回顧愛人在我生兒...
    精靈寶貝_7842閱讀 321評論 0 0