celery學習筆記

Celery

標簽(空格分隔): celery


Celery是一個分布式任務隊列工具,是一個異步的任務隊列基于分布式消息傳遞肄鸽。參考官網(wǎng)勤篮。

1. 基礎概念

  • Broker绿满,簡單說就是"消息隊列"辛蚊,Celery的基本工作是管理分配任務到不同的服務器粤蝎,至于服務器之間的通信則是交給了如“RabbitMQ” 第三方服務。
  • Task袋马,任務初澎,在Celery中,每個Python function就是一個task虑凛,只要在function前面修飾”@task()“碑宴,Celery就知道這是一個task,需要異步調用task的時候桑谍,task.delay()就可以了延柠,當然有更復雜的調用函數(shù),task.apply_async()锣披,這里面可以指定啥時候調用什么的贞间,這里的調用就是將task加入到queue中,而queue是保存在指定的Broker中的盈罐。
  • Worker榜跌,Celery將你要異步處理的task加入到一個queue中,然后空閑的Worker就會將queue中的task給取走交給服務器盅粪。

2. 任務調用

任務(task)調用有三個API:

#給任務發(fā)送消息
apply_async(args[,kwargs[, ...]])

#給任務發(fā)送消息的簡單版钓葫,但是不支持execution options(apply_async有三個部分的參數(shù),第一部分就是task里面的python function的參數(shù)票顾,比如add(x,y)的x,y础浮,第二個參數(shù)叫作keyword arguments,就是設定一些環(huán)境變量奠骄,第三個參數(shù)就是execution options豆同,也就是這個task本身的執(zhí)行選項,時間啊之類)
delay(*args, **kwargs)

#類似直接調用的意思含鳞,即不是讓worker來執(zhí)行任務影锈,而是當前的進程來執(zhí)行。
calling(__call__)

關于execution options有這些主要的參數(shù):

Link(callbacks/errbacks)

就是一個任務接著一個蝉绷,回調任務作為一個partial argument在父任務完成的時候被調用鸭廷。

add.apply_async((2, 2), link=add.s(16))

即(2 + 2) + 16 = 20

ETA and countdown

eta必須是一個datatime對象。你可以設定一個eta熔吗,可以讓你的任務在這個eta開始辆床。
countdown是一個整型,它是eta的簡版桅狠,以秒為單位讼载。
這兩個都保證任務會在這個時間后執(zhí)行轿秧,但是這個時間無法非常確定,因為各方面的原因(網(wǎng)絡延時咨堤,任務隊列太繁忙)菇篡。

Expiration

expires參數(shù)定義了一個可選的到期時間,可以以秒為單位吱型,也可以以datetime逸贾。

序列化

數(shù)據(jù)在客戶端于worker之間的傳遞需要序列化。
Celery內建的支持 pickle,json,yaml和msgpack方式序列化津滞,當然也可以自定義序列化方式(要在Kombu中注冊)铝侵。
如果要指定某種內建的方式:

>>> add.apply_async((10, 10), serializer='json')

壓縮

Celery支持gzip和bzip2,當然你也可以自定義壓縮的方式(要在kombu中注冊)触徐。
指定某種方式的話:

>>> add.apply_async((2, 2), compression='zlib')

3. Canvas:Designing Workflows

有時候咪鲜,你需要把一個調用函數(shù)的某些信息傳遞到一個進程或者做為參數(shù)傳遞到另外一個函數(shù)的時候,Celery用一種叫subtasks完成這種任務撞鹉。如:

>>> add.subtask((2,2), countdown=10)
tasks.add(2,2)

簡寫方式:

>>> add.s(2,2)
tasks.add(2,2)

subtasks的實例也支持調用API疟丙,也就是delay和apply_async方法。
但對于subtasks也有一些不同鸟雏,看例子:

>>> s1 = add.s(2, 2)
>>> res = s1.delay()
>>> res.get()
4

add任務接受兩個參數(shù)享郊,這個subtasks指定了兩個參數(shù),它就完成了一個complete signature孝鹊。

但是這樣:

# incomplete partial: add(?, 2)
>>> s2 = add.s(2)

這種incomplete signatures稱之為partials炊琉。
這個時候,s2需要另外一個參數(shù)才能完成運算又活,而再次調用的時候苔咪,就可以完成了,像這樣:

# resolves the partial: add(8, 2)
>>> res = s2.delay(8)
>>> res.get()
10

The Primitives(原語柳骄?)

The primitives are subtasks themselves, so that they can be combined in any number of ways to compose complex workflows.

Groups

一個group調用了一系列parallel的任務团赏,看例子:

>>> from celery import group
>>> from proj.tasks import add
>>> group(add.s(i, i) for i in xrange(10))().get()
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Partial group:

>>> g = group(add.s(i) for i in xrange(10))
>>> g(10).get()
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

add.s(i)這個就是partial,只有一個參數(shù)耐薯,所以在g(10)中傳遞10這個參數(shù)之后舔清,每個add.s(i,10),就make a complete signature了曲初。

Chains

任務是可以被鏈接的体谒,也就是一個任務完成后,就把結果返回給另外一個任務复斥,像這樣:

>>> from celery import chain
>>> from proj.tasks import add, mul
# (4 + 4) * 8
>>> chain(add.s(4, 4) | mul.s(8))().get()
64

還有partial chain:

# (? + 4) * 8
>>> g = chain(add.s(4) | mul.s(8))
>>> g(4).get()
64

還有這樣的寫法也是可以的:

>>> (add.s(4, 4) | mul.s(8))().get()
64

Chords

一個chord就是group帶有一個回調:

>>> from celery import chord
>>> from proj.tasks import add, xsum
>>> chord((add.s(i, i) for i in xrange(10)), xsum.s())().get()
90

一個group通過chain另一個任務营密,就會自動變成一個chord:

>>> (group(add.s(i, i) for i in xrange(10)) | xsum.s())().get()
90

由于這些primitives都是subtask類型械媒,所以可以任意組合成你想要的樣子目锭,比如:

>>> upload_document.s(file) | group(apply_filter.s() for filter in filters)

Signatures

signature()用一種能傳遞給一個函數(shù)的方式评汰,包含了一個任務調用的 arguments(參數(shù),即任務本身的參數(shù)痢虹,像add(x,y)中的參數(shù)), keyword arguments(關鍵字參數(shù)被去,就是debug=false,true這類參數(shù)), and execution options(執(zhí)行選項,比如運行時間countdown奖唯,到期時間expirt)惨缆。

signatures通常也被叫作"subtasks"》峤荩可以這樣用:

>>> from celery import signature
>>> signature('tasks.add', args=(2, 2), countdown=10)
tasks.add(2, 2)

或者你直接使用task的subtask方法:

>>> add.subtask((2, 2), countdown=10)
tasks.add(2, 2)

簡寫版就是這樣:

>>> add.s(2, 2)
tasks.add(2, 2)

Immutabel signatures

意思就是partial的任務可以在回調的時候坯墨,把參數(shù)值再傳進來,但有時候并不想得到某個函數(shù)的值病往,這個時候就可以把這個函數(shù)的immutable設成true:

>>> add.subtask((2, 2), immutable=True)

也可以簡寫:

>>> add.si(2, 2)

看例子:

>>> res = (add.si(2, 2) | add.si(4, 4) | add.s(8, 8))()
>>> res.get()
16
>>> res.parent.get()
8
>>> res.parent.parent.get()
4
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末捣染,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子停巷,更是在濱河造成了極大的恐慌耍攘,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畔勤,死亡現(xiàn)場離奇詭異蕾各,居然都是意外死亡,警方通過查閱死者的電腦和手機庆揪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門式曲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嚷硫,你說我怎么就攤上這事检访。” “怎么了仔掸?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵脆贵,是天一觀的道長。 經(jīng)常有香客問我起暮,道長卖氨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任负懦,我火速辦了婚禮筒捺,結果婚禮上,老公的妹妹穿的比我還像新娘纸厉。我一直安慰自己系吭,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布颗品。 她就那樣靜靜地躺著肯尺,像睡著了一般沃缘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上则吟,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天槐臀,我揣著相機與錄音,去河邊找鬼氓仲。 笑死水慨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的敬扛。 我是一名探鬼主播晰洒,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啥箭!你這毒婦竟也來了欢顷?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捉蚤,失蹤者是張志新(化名)和其女友劉穎抬驴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缆巧,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡布持,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了陕悬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片题暖。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捉超,靈堂內的尸體忽然破棺而出胧卤,到底是詐尸還是另有隱情,我是刑警寧澤拼岳,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布枝誊,位于F島的核電站,受9級特大地震影響惜纸,放射性物質發(fā)生泄漏叶撒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一耐版、第九天 我趴在偏房一處隱蔽的房頂上張望祠够。 院中可真熱鬧,春花似錦粪牲、人聲如沸古瓤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽落君。三九已至滴须,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叽奥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工痛侍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赵哲。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓枫夺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親橡庞。 傳聞我的和親對象是個殘疾皇子扒最,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容

  • Tips:在學習Celery過程中耙厚,使用的系統(tǒng)為Windows 10俯渤、Celery版本為3.1.18①稠诲、中間人使用...
    嘿嘿_小于同學閱讀 5,671評論 7 10
  • Celery 是一個由 Python 編寫的簡單、靈活劝萤、可靠的用來處理大量信息的分布式系統(tǒng)床嫌,它同時提供操作和維護分...
    lijun_m閱讀 357評論 0 0
  • http://docs.celeryproject.org/en/latest/getting-started/f...
    暫時還沒有昵稱2222閱讀 132評論 0 0
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法阔涉,而不是構造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法瑰排,并非Fa...
    孫小磊閱讀 1,996評論 0 3
  • 為了在后臺運行任務,我們可以使用線程(或者進程)宅广。使用線程(或者進程)的好處是保持處理邏輯簡潔乘碑。但是,在需要可擴展...
    摸不去的塵閱讀 7,476評論 0 20