一種基于python的pipeline框架設(shè)計思路

一.? pipeline任務(wù)描述

? ? ? ? 在執(zhí)行某序列化任務(wù)的時候,通常可將任務(wù)劃分為多個stage分別進行模塊化,每一個stage可抽象為一個處理方法贼急、一個處理類或一個處理模塊,最簡單一個的流程任務(wù)(無分支)瓤摧,如下圖:

最簡單一個的處理流程

? ? ? ? ? 對于一個完整的處理流程有如下說明:

? ? ? ? ? 1.? 每個處理單元具有業(yè)務(wù)處理原子性特征竿裂,每個處理單元僅處理單一的功能需求

? ? ? ? ? 2.? 每個處理單元可能有多個來自其他單元的輸入數(shù)據(jù)玉吁,也可以向多個其他單元輸出數(shù)據(jù)

? ? ? ? ? 3.? 某單元的輸入可依賴于上一個單元或多個單元的輸出照弥,需等待所有的前置單元都處理完才能執(zhí)行此單元

二.? 可能的執(zhí)行場景

? ? ? ?基于以上說明,可以將pipeline的流程簡單概括為一下幾種可能的執(zhí)行場景:

樣例01

????樣例01表示最簡單的流線式模塊處理进副,無分支这揣,前一個節(jié)點處理結(jié)束再處理下一個節(jié)點。

樣例02

????樣例02表示單個節(jié)點可能有0到N個輸入影斑,也可能有1到N個輸出给赞;同時,單節(jié)點的多個輸入可來自不同的節(jié)點的任意輸出或單節(jié)點的多個輸出數(shù)據(jù)流向不同的后置節(jié)點矫户。

樣例03

? ???樣例03表示pipeline的處理流程節(jié)點不是一棵簡單的樹形結(jié)構(gòu)片迅,可能存在多個根節(jié)點。

三.? 利用JSON對pipeline進行結(jié)構(gòu)描述

? ? ? 如何設(shè)計一種通用的數(shù)據(jù)結(jié)構(gòu)來描述一個pipeline,既可以實現(xiàn)以上樣例的幾種場景皆辽,也可以實現(xiàn)其他更復雜的pipeline場景柑蛇。設(shè)計要點:

? ? ? 1. 對pipline中每個抽象節(jié)點的實例化描述

? ? ? ?2. 對pipeline中每個節(jié)點的模塊參數(shù)的描述(即節(jié)點執(zhí)行需要的配置參數(shù),而非input端口數(shù)據(jù))

? ? ? ?3.?對pipeline中每個節(jié)點的輸入輸入端口的描述

? ? ? ?4.? 對pipeline中每個節(jié)點的對其他節(jié)點輸入輸入端口依賴關(guān)系的描述

????最終的實現(xiàn)方式如下(JSON數(shù)據(jù)):

pipeline流程結(jié)構(gòu)描述

? ? 其中包括以下幾點:

? ? 1.? pipeline_id 每個pipeline都有一個唯一的ID驱闷,多個pipeline同時獨立運行時會用到

? ? 2.? pipeline_items是一個數(shù)組耻台,里面每一個大括號都是一個特定類型的模塊實例化時需要的信息

? ? 3.? id為某模塊實例化后的ID號,在一個pipeline中此id唯一

? ? 4.? type為此模塊的類型(整個pipeline中涉及到多個類型的模塊)?

? ? 3.? parameters為該模塊需要執(zhí)行時需要的特定參數(shù)空另,每個模塊的parameters定義可能不同

? ? 4.? ?inputs的定義盆耽,inputs中定義了一個模塊所需輸入數(shù)據(jù)的來源,framNodeId和fromOutputId代表某輸入是從哪一個前置模塊的哪一個輸出端口輸出的數(shù)據(jù)

? ? 注:某模塊的輸入端口的描述名稱(input_01扼菠,input_02)需要預(yù)先在模塊對外接口中定義好摄杂,并且一一對應(yīng),否則可能會導致傳遞的數(shù)據(jù)值或者數(shù)據(jù)類型錯亂循榆。

三.? PipelineFramework的實現(xiàn)概要

? ??PipelineFramework程序框架用來加載pipeline JSON析恢,組裝、調(diào)度模塊的順序執(zhí)行冯痢,其實現(xiàn)有以下幾個問題需要解決:

? ?1.? 一個模塊需要執(zhí)行氮昧,如何保證其依賴的所有前置模塊都已經(jīng)執(zhí)行結(jié)束

? ?2.? 如何在內(nèi)存中將每個模塊的每個輸出端口緩存框杜,提供給后置模塊去使用

? ?3.? 如何定義所有模塊統(tǒng)一的接口,然后使PipelineFramework通過統(tǒng)一的方式調(diào)用(類似類的多態(tài)性)


? ??第一個問題的解決:

? ? ?多次全流程模塊掃描袖肥,每一次拿出尚未執(zhí)行并且已經(jīng)滿足所有前置條件的模塊進行運行咪辱,執(zhí)行結(jié)束后將模塊ID和執(zhí)行后的結(jié)果保存到內(nèi)存變量中。當某一次掃描中所有的模塊已經(jīng)被執(zhí)行了則退出掃描椎组,具體代碼如下:

PipelineFramework主要方法

? ??第二個問題的解決:

? ? ?當每個模塊執(zhí)行結(jié)束后的返回結(jié)果是一個map類型的數(shù)據(jù)油狂,key為該模塊輸出端口的ID(如output_01,output_02),value為輸出數(shù)據(jù)(由于python弱類型引用,因此value可以為任意類型),部分代碼如下:

模塊內(nèi)部處理和輸出定義

? ??第三個問題的解決:

? ? ? ? ? 1.? 每個模塊都封裝成類寸癌,且包含都兩個方法:__init__方法進行參數(shù)和輸入數(shù)據(jù)的初始化专筷,? module_process進行具體的業(yè)務(wù)處理(如上圖)。

? ? ? ? ? 2.? 通過定義PipelineModuleFactory進行統(tǒng)一的模塊接口獲取和調(diào)用蒸苇。

PipelineModuleFactory的定義

? ? ? ? ? 3.? 在PipelineFramework中進行統(tǒng)一的調(diào)用執(zhí)行

PipelineFramework統(tǒng)一調(diào)用

四.? 后續(xù)的優(yōu)化

? ? ?1. 通過multiprocessing 實現(xiàn)多模塊并行執(zhí)行

? ? ? 2. 模塊運行過程監(jiān)控和重試機制?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磷蛹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子溪烤,更是在濱河造成了極大的恐慌味咳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檬嘀,死亡現(xiàn)場離奇詭異槽驶,居然都是意外死亡,警方通過查閱死者的電腦和手機鸳兽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門掂铐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揍异,你說我怎么就攤上這事全陨。” “怎么了蒿秦?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵烤镐,是天一觀的道長。 經(jīng)常有香客問我棍鳖,道長炮叶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任渡处,我火速辦了婚禮镜悉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘医瘫。我一直安慰自己侣肄,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布醇份。 她就那樣靜靜地躺著稼锅,像睡著了一般吼具。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矩距,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天拗盒,我揣著相機與錄音,去河邊找鬼锥债。 笑死陡蝇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的哮肚。 我是一名探鬼主播登夫,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼允趟!你這毒婦竟也來了恼策?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拼窥,失蹤者是張志新(化名)和其女友劉穎戏蔑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲁纠,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年鳍寂,在試婚紗的時候發(fā)現(xiàn)自己被綠了改含。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡迄汛,死狀恐怖捍壤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鞍爱,我是刑警寧澤鹃觉,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站睹逃,受9級特大地震影響盗扇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沉填,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一疗隶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翼闹,春花似錦斑鼻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜀备。三九已至,卻和暖如春荒叶,著一層夾襖步出監(jiān)牢的瞬間琼掠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工停撞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓷蛙,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓戈毒,卻偏偏與公主長得像艰猬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子埋市,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

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