本申請涉及計算機(jī)技術(shù)領(lǐng)域,尤其涉及代碼異常處理、代碼執(zhí)行方法及裝置。
背景技術(shù):
隨著計算機(jī)技術(shù)與軟件業(yè)務(wù)需求的發(fā)展,單個軟件甚至軟件中某個功能的代碼越來越大,這樣對于代碼執(zhí)行的效率提出了更高的要求。
通常,一個完整的代碼是由若干代碼段組成,所以可以將所述代碼段視為功能模塊,本文中將這樣的代碼段稱之為代碼節(jié)點(diǎn)。
現(xiàn)有技術(shù)中,在代碼節(jié)點(diǎn)出現(xiàn)異常的情況下,代碼執(zhí)行設(shè)備只能從頭開始執(zhí)行代碼。由此,導(dǎo)致代碼執(zhí)行效率較低。
技術(shù)實(shí)現(xiàn)要素:
本申請?zhí)峁┐a異常處理、代碼執(zhí)行方法及裝置,以解決現(xiàn)有技術(shù)中代碼執(zhí)行過程中出現(xiàn)異常時從頭開始執(zhí)行,導(dǎo)致代碼執(zhí)行效率較低的問題。
根據(jù)本申請實(shí)施例提供的一種代碼異常處理方法,所述方法包括:
在代碼節(jié)點(diǎn)出現(xiàn)異常后,確定與該代碼節(jié)點(diǎn)距離最近的持久化代碼節(jié)點(diǎn);其中,所述持久化代碼節(jié)點(diǎn)為具有持久化數(shù)據(jù)的代碼節(jié)點(diǎn);
獲取該持久化代碼節(jié)點(diǎn)的持久化數(shù)據(jù);
以所獲取的持久化數(shù)據(jù)作為輸入數(shù)據(jù),從所確定的持久化代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)開始執(zhí)行。
根據(jù)本申請實(shí)施例提供的一種代碼執(zhí)行方法,所述方法包括:
根據(jù)預(yù)設(shè)規(guī)則對待執(zhí)行的代碼進(jìn)行解析,從而得到所述代碼中每一個代碼節(jié)點(diǎn)所屬的依賴關(guān)系,所述依賴關(guān)系包括流依賴、映射依賴和打亂依賴;
在執(zhí)行每一個代碼節(jié)點(diǎn)后,判斷該代碼節(jié)點(diǎn)是否為持久化代碼節(jié)點(diǎn);
如果是,則持久化該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
根據(jù)本申請實(shí)施例提供的一種代碼異常處理裝置,所述裝置包括:
確定單元,在代碼節(jié)點(diǎn)出現(xiàn)異常后,確定與該代碼節(jié)點(diǎn)距離最近的持久化代碼節(jié)點(diǎn);其中,所述持久化代碼節(jié)點(diǎn)為具有持久化數(shù)據(jù)的代碼節(jié)點(diǎn);
獲取單元,獲取該持久化代碼節(jié)點(diǎn)的持久化數(shù)據(jù);
執(zhí)行單元,以所獲取的持久化數(shù)據(jù)作為輸入數(shù)據(jù),從所確定的持久化代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)開始執(zhí)行。
根據(jù)本申請實(shí)施例提供的一種代碼執(zhí)行裝置,所述裝置應(yīng)用于代碼執(zhí)行設(shè)備上,所述裝置包括:
解析單元,根據(jù)預(yù)設(shè)規(guī)則對待執(zhí)行的代碼進(jìn)行解析,從而得到所述代碼中每一個代碼節(jié)點(diǎn)所屬的依賴關(guān)系,所述依賴關(guān)系包括流依賴、映射依賴和打亂依賴;
判斷單元,在執(zhí)行每一個代碼節(jié)點(diǎn)后,判斷該代碼節(jié)點(diǎn)是否為持久化代碼節(jié)點(diǎn);
持久化單元,在該代碼節(jié)點(diǎn)為持久化代碼節(jié)點(diǎn)的情況下,持久化該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
本申請實(shí)施例中,在代碼執(zhí)行過程中,通過對持久化代碼節(jié)點(diǎn)的輸出數(shù)據(jù)進(jìn)行持久化處理,如此后續(xù)代碼節(jié)點(diǎn)出現(xiàn)異常后,可以獲取距離所述代碼節(jié)點(diǎn)最近的持久化代碼節(jié)點(diǎn)的持久化數(shù)據(jù),以所述持久化數(shù)據(jù)作為輸入數(shù)據(jù),從所述持久化代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)開始執(zhí)行。應(yīng)用本申請實(shí)施例中,在代碼節(jié)點(diǎn)出現(xiàn)異常后,無需從頭開始執(zhí)行,從而提高了代碼執(zhí)行的效率。
附圖說明
圖1是本申請?zhí)峁┑拇a節(jié)點(diǎn)拓?fù)鋱D;
圖2是本申請一實(shí)施例提供的代碼異常處理方法的流程圖;
圖3是本申請?zhí)峁┑拇a節(jié)點(diǎn)拓?fù)鋱D;
圖4是本申請?zhí)峁┑拇a節(jié)點(diǎn)拓?fù)鋱D;
圖5是本申請一實(shí)施例提供的代碼執(zhí)行方法的流程圖;
圖6是本申請?zhí)峁┑拇a異常處理裝置所在設(shè)備的一種硬件結(jié)構(gòu)圖;
圖7是本申請一實(shí)施例提供的代碼異常處理裝置的模塊示意圖;
圖8是本申請?zhí)峁┑拇a執(zhí)行裝置所在設(shè)備的一種硬件結(jié)構(gòu)圖;
圖9是本申請一實(shí)施例提供的代碼執(zhí)行裝置的模塊示意圖。
具體實(shí)施方式
這里將詳細(xì)地對示例性實(shí)施例進(jìn)行說明,其示例表示在附圖中。下面的描述涉及附圖時,除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本申請相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本申請的一些方面相一致的裝置和方法的例子。
在本申請使用的術(shù)語是僅僅出于描述特定實(shí)施例的目的,而非旨在限制本申請。在本申請和所附權(quán)利要求書中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當(dāng)理解,本文中使用的術(shù)語“和/或”是指并包含一個或多個相關(guān)聯(lián)的列出項目的任何或所有可能組合。
應(yīng)當(dāng)理解,盡管在本申請可能采用術(shù)語第一、第二、第三等來描述各種信息,但這些信息不應(yīng)限于這些術(shù)語。這些術(shù)語僅用來將同一類型的信息彼此區(qū)分開。例如,在不脫離本申請范圍的情況下,第一信息也可以被稱為第二信息,類似地,第二信息也可以被稱為第一信息。取決于語境,如在此所使用的詞語“如果”可以被解釋成為“在……時”或“當(dāng)……時”或“響應(yīng)于確定”。
請參考圖1為某代碼對應(yīng)的代碼節(jié)點(diǎn)拓?fù)鋱D,該代碼完整的執(zhí)行過程為:首先執(zhí)行a代碼節(jié)點(diǎn),再執(zhí)行b代碼節(jié)點(diǎn),最后執(zhí)行c代碼節(jié)點(diǎn)。假設(shè)a代碼節(jié)點(diǎn)的輸入數(shù)據(jù)為Assembly1。如下為該代碼的執(zhí)行過程:
開始執(zhí)行;
執(zhí)行a代碼節(jié)點(diǎn):對輸入數(shù)據(jù)Assembly1進(jìn)行處理后輸出數(shù)據(jù)Assembly1’,并將Assembly1銷毀;
執(zhí)行b代碼節(jié)點(diǎn):對輸入數(shù)據(jù)Assembly1’(即a代碼節(jié)點(diǎn)的輸出數(shù)據(jù))進(jìn)行處理后輸出數(shù)據(jù)Assembly1”,并將Assembly1’銷毀;
執(zhí)行c代碼節(jié)點(diǎn):對輸入數(shù)據(jù)Assembly1”(即b代碼節(jié)點(diǎn)的輸出數(shù)據(jù))進(jìn)行處理后輸出數(shù)據(jù)Assembly,并將Assembly1”銷毀;
結(jié)束執(zhí)行。
整個代碼執(zhí)行完成后最終輸出數(shù)據(jù)為Assembly。通過上述代碼的執(zhí)行過程可知,在每個代碼節(jié)點(diǎn)執(zhí)行完畢后都會將輸入數(shù)據(jù)銷毀。如此,如果代碼執(zhí)行過程中出現(xiàn)一些異常情況(代碼節(jié)點(diǎn)執(zhí)行錯誤或者數(shù)據(jù)發(fā)生丟失、程序崩潰等),只能從頭開始執(zhí)行。
為了解決上述問題,本申請實(shí)施例提出了一個代碼異常處理方法,參見圖2為本申請一實(shí)施例提供的代碼異常處理方法的流程圖,所述方法可以包括以下步驟:
步驟110:在代碼節(jié)點(diǎn)出現(xiàn)異常后,確定與該代碼節(jié)點(diǎn)距離最近的持久化代碼節(jié)點(diǎn);
本實(shí)施例中,一般執(zhí)行代碼過程中都會開啟異常監(jiān)測,異常檢測手段是業(yè)內(nèi)常用技術(shù)。通常在代碼節(jié)點(diǎn)異常會報錯,所述異??梢园▓?zhí)行錯誤、數(shù)據(jù)異常(如數(shù)據(jù)丟失、數(shù)據(jù)錯誤)、程序崩潰等情況。
在代碼節(jié)點(diǎn)出現(xiàn)異常后,代碼執(zhí)行設(shè)備就可以確定與該代碼節(jié)點(diǎn)距離最近的持久化代碼節(jié)點(diǎn)。其中,所述持久化代碼節(jié)點(diǎn)為具有持久化數(shù)據(jù)的代碼節(jié)點(diǎn)。
所述持久化代碼節(jié)點(diǎn)用于將輸出數(shù)據(jù)進(jìn)行持久化。例如,假設(shè)a代碼節(jié)點(diǎn)是持久化代碼節(jié)點(diǎn),那么在a代碼節(jié)點(diǎn)執(zhí)行完畢后,可以將所述a代碼節(jié)點(diǎn)輸出數(shù)據(jù)進(jìn)行持久化。通常,所述持久化數(shù)據(jù)可以保存在內(nèi)存中,也可以保存在硬盤中。
以下舉例說明,如圖3所示,某代碼執(zhí)行需要首先分別執(zhí)行a代碼節(jié)點(diǎn)、b代碼節(jié)點(diǎn),再執(zhí)行c代碼節(jié)點(diǎn),最后執(zhí)行d代碼節(jié)點(diǎn);其中c代碼節(jié)點(diǎn)為持久化代碼節(jié)點(diǎn)。該代碼執(zhí)行過程中,c代碼節(jié)點(diǎn)執(zhí)行完畢后會持久化輸出數(shù)據(jù);如果在執(zhí)行d代碼節(jié)點(diǎn)(當(dāng)前代碼節(jié)點(diǎn))時出現(xiàn)異常,則獲取距離d代碼節(jié)點(diǎn)最近的持久化代碼節(jié)點(diǎn)即c代碼節(jié)點(diǎn)的持久化數(shù)據(jù)。
以下詳細(xì)介紹所述持久化數(shù)據(jù)是如何生成的:
在一種可選的實(shí)施例中,所述持久化數(shù)據(jù)通過如下方式生成:
確定代碼節(jié)點(diǎn)具有持久化標(biāo)識的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
本實(shí)施例中,用戶可以人為預(yù)先對代碼節(jié)點(diǎn)配置持久化標(biāo)識,例如某個代碼節(jié)點(diǎn)處理數(shù)據(jù)比較復(fù)雜,輸出數(shù)據(jù)比較重要,那么用戶就可以對該代碼節(jié)點(diǎn)配置一個持久化標(biāo)識;當(dāng)然用戶也可以對該代碼節(jié)點(diǎn)不設(shè)置持久化標(biāo)識,這里只是給用戶增加了一個選項。如此,在代碼執(zhí)行時,所述代碼執(zhí)行設(shè)備通過判斷所述代碼節(jié)點(diǎn)是否具有持久化標(biāo)識,在確定所述代碼節(jié)點(diǎn)具有持久化標(biāo)識的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
在一種可選的實(shí)施例中,所述持久化數(shù)據(jù)通過如下方式生成:
確定代碼節(jié)點(diǎn)為最后一個代碼節(jié)點(diǎn)的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
通過本實(shí)施例,默認(rèn)持久化最后一個代碼節(jié)點(diǎn)的輸出數(shù)據(jù),如果發(fā)生輸出數(shù)據(jù)丟失的情況,可以快速獲取最后一個代碼節(jié)點(diǎn)的持久化數(shù)據(jù)。
在另一種可選的實(shí)施例中,所述持久化數(shù)據(jù)可以通過如下方式中的至少一種生成:
第一種:確定代碼節(jié)點(diǎn)與前一級代碼節(jié)點(diǎn)之間為流依賴的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù);
第二種:確定代碼節(jié)點(diǎn)與前一級代碼節(jié)點(diǎn)之間為映射依賴的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù);
第三種:確定代碼節(jié)點(diǎn)與前一級代碼節(jié)點(diǎn)之間為打亂依賴的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
本實(shí)施例中,所述前一級代碼節(jié)點(diǎn)是當(dāng)前代碼節(jié)點(diǎn)前并和當(dāng)前代碼節(jié)點(diǎn)有直接聯(lián)系的代碼節(jié)點(diǎn)。例如,圖3中c代碼節(jié)點(diǎn)的前一級代碼節(jié)點(diǎn)為a代碼節(jié)點(diǎn)和b代碼節(jié)點(diǎn);d代碼節(jié)點(diǎn)的前一級代碼節(jié)點(diǎn)為c代碼節(jié)點(diǎn);a代碼節(jié)點(diǎn)、b代碼節(jié)點(diǎn)沒有上一級代碼節(jié)點(diǎn)。
所述流依賴:代碼節(jié)點(diǎn)的輸入數(shù)據(jù)只來自一個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù);定義這兩個代碼節(jié)點(diǎn)之間為流依賴。如圖3中c代碼節(jié)點(diǎn)->d代碼節(jié)點(diǎn),因?yàn)閐代碼節(jié)點(diǎn)的輸入數(shù)據(jù)只來自c代碼節(jié)點(diǎn)的輸出數(shù)據(jù),所以可以確定d代碼節(jié)點(diǎn)與c代碼節(jié)點(diǎn)之間為流依賴。
映射依賴:代碼節(jié)點(diǎn)的輸入數(shù)據(jù)至少來自兩個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù),并且該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)一一對應(yīng)輸入數(shù)據(jù);定義代碼節(jié)點(diǎn)與多個上一級代碼節(jié)點(diǎn)之間為映射依賴。如圖3中a代碼節(jié)點(diǎn)和b代碼節(jié)點(diǎn)->c代碼節(jié)點(diǎn),因?yàn)閏代碼節(jié)點(diǎn)的輸入數(shù)據(jù)來自a代碼節(jié)點(diǎn)和b代碼節(jié)點(diǎn)的輸出數(shù);假設(shè)c代碼節(jié)點(diǎn)的輸出數(shù)據(jù)不一一對應(yīng)輸入數(shù)據(jù)。例如,c代碼節(jié)點(diǎn)的輸入數(shù)據(jù)為姓名、年齡,輸出數(shù)據(jù)為姓名+年齡,因?yàn)檩敵鰯?shù)據(jù)一一對應(yīng)輸入數(shù)據(jù),所以可以確定c代碼節(jié)點(diǎn)與a、b代碼節(jié)點(diǎn)之間為映射依賴。
打亂依賴:代碼節(jié)點(diǎn)的輸入數(shù)據(jù)至少來自兩個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù),并且該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)不一一對應(yīng)輸入數(shù)據(jù);定義代碼節(jié)點(diǎn)與多個上一級代碼節(jié)點(diǎn)之間為打亂依賴。如圖3中a代碼節(jié)點(diǎn)和b代碼節(jié)點(diǎn)->c代碼節(jié)點(diǎn),因?yàn)閏代碼節(jié)點(diǎn)的輸入數(shù)據(jù)來自a代碼節(jié)點(diǎn)和b代碼節(jié)點(diǎn)的輸出數(shù);假設(shè)c代碼節(jié)點(diǎn)的輸出數(shù)據(jù)一一對應(yīng)輸入數(shù)據(jù)。例如,c代碼節(jié)點(diǎn)的輸入數(shù)據(jù)為員工考勤(記錄了工號和考勤情況的對應(yīng)關(guān)系)和員工信息(記錄了姓名和工號的對應(yīng)關(guān)系);輸出數(shù)據(jù)為姓名+考勤,因?yàn)樾枰獙蓚€輸入數(shù)據(jù)結(jié)合才可以得到姓名+考勤的輸出數(shù)據(jù),所以可以確定為c代碼節(jié)點(diǎn)與a、b代碼節(jié)點(diǎn)之間為打亂依賴。
通過上述三種情況中的任意一種或者組合,都可以實(shí)現(xiàn)持久化代碼節(jié)點(diǎn)的輸出數(shù)據(jù),從而供后續(xù)代碼節(jié)點(diǎn)發(fā)生異常時獲取持久化數(shù)據(jù)。
如上所述持久化的過程中,對于流依賴、映射依賴和打亂依賴的代碼節(jié)點(diǎn)均進(jìn)行持久化處理。在實(shí)際應(yīng)用中,如果代碼較為復(fù)雜或者涉及到的數(shù)據(jù)量較多的情況下,可能會出現(xiàn)持久化數(shù)據(jù)過多導(dǎo)致存儲空間不足的問題,特別是當(dāng)持久化數(shù)據(jù)存儲在內(nèi)存中時,那么內(nèi)存不足會直接影響代碼執(zhí)行效率。通常,由于流依賴的代碼節(jié)點(diǎn)處理數(shù)據(jù)相對簡單,所以不需要對每個流依賴的代碼節(jié)點(diǎn)的輸出數(shù)據(jù)進(jìn)行持久化,例如某一個流依賴的代碼節(jié)點(diǎn)僅對數(shù)據(jù)進(jìn)行傳遞時,完全不需要進(jìn)行持久化。
針對第一種方式,為了解決上述問題,在一種可選的實(shí)施例中:
確定代碼節(jié)點(diǎn)與前一級代碼節(jié)點(diǎn)之間為流依賴的情況下,輸出配置接口給用戶,以使得用戶可以對該代碼節(jié)點(diǎn)設(shè)置持久化標(biāo)識,當(dāng)然用戶也可以對該代碼節(jié)點(diǎn)不設(shè)置持久化標(biāo)識,所以這里只是給用戶增加了一個選項。
在代碼節(jié)點(diǎn)具有持久化標(biāo)識的情況下,該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)需要被持久化。
通過本實(shí)施例,對于流依賴的代碼節(jié)點(diǎn),在具有持久化標(biāo)識的情況下會進(jìn)行持久化處理,在沒有持久化標(biāo)識的情況下不用進(jìn)行持久化處理。如此可以減少持久化數(shù)據(jù)的產(chǎn)生避免持久化數(shù)據(jù)過多導(dǎo)致存儲空間不足。
類似地,在實(shí)際應(yīng)用中,由于映射依賴的代碼節(jié)點(diǎn)處理數(shù)據(jù)也相對簡單,所以并不一定需要對每個映射依賴的代碼節(jié)點(diǎn)的輸出數(shù)據(jù)進(jìn)行持久化。為了防止存儲持久化數(shù)據(jù)的存儲空間不足,針對第二種方式,在一種可選的實(shí)施例中:
確定代碼節(jié)點(diǎn)與前一級代碼節(jié)點(diǎn)之間為映射依賴的情況下,輸出配置接口給用戶,以使得用戶可以對該代碼節(jié)點(diǎn)設(shè)置持久化標(biāo)識,當(dāng)然用戶也可以對該代碼節(jié)點(diǎn)不設(shè)置持久化標(biāo)識,所以這里只是給用戶增加了一個選項。
在代碼節(jié)點(diǎn)具有持久化標(biāo)識的情況下,該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)需要被持久化。
通過本實(shí)施例,對于映射依賴的代碼節(jié)點(diǎn),在具有持久化標(biāo)識的情況下會進(jìn)行持久化處理,在沒有持久化標(biāo)識的情況下不用進(jìn)行持久化處理。如此可以減少持久化數(shù)據(jù)的產(chǎn)生避免持久化太多數(shù)據(jù)過多導(dǎo)致存儲空間不足。
如上流依賴或者映射依賴的實(shí)施例中,在所述判斷所述代碼節(jié)點(diǎn)是否具有持久化標(biāo)識之后,所述方法還包括:
在所述代碼節(jié)點(diǎn)不具有持久化標(biāo)識的情況下,判斷所述代碼節(jié)點(diǎn)是否為最后一個代碼節(jié)點(diǎn);
在所述代碼節(jié)點(diǎn)為最后一個代碼節(jié)點(diǎn)的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
本實(shí)施例中,對于流依賴或者映射依賴的代碼節(jié)點(diǎn),如果該代碼節(jié)點(diǎn)不具有持久化標(biāo)識,代碼執(zhí)行設(shè)備進(jìn)一步可以判斷是否為最后一個代碼節(jié)點(diǎn);如果是最后一個代碼節(jié)點(diǎn),則持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。也就是說,即使最后一個代碼節(jié)點(diǎn)沒有人為預(yù)設(shè)的持久化標(biāo)識,所述代碼執(zhí)行設(shè)備也需要持久化最后一個代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
通過本實(shí)施例,默認(rèn)持久化最后一個代碼的輸出數(shù)據(jù),如果發(fā)生輸出數(shù)據(jù)丟失的情況,可以快速獲取最后一個代碼節(jié)點(diǎn)的持久化數(shù)據(jù)。
步驟120:獲取該持久化代碼節(jié)點(diǎn)的持久化數(shù)據(jù)。
本實(shí)施例中,通過步驟110中確定的持久化代碼節(jié)點(diǎn),就可以獲取該持久化代碼節(jié)點(diǎn)的持久化數(shù)據(jù)。
步驟130:以所獲取的持久化數(shù)據(jù)作為輸入數(shù)據(jù),從所確定的持久化代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)開始執(zhí)行。
本實(shí)施例中,代碼執(zhí)行設(shè)備在確定了距離所述代碼節(jié)點(diǎn)最近的持久化代碼節(jié)點(diǎn)及獲取了該持久化代碼節(jié)點(diǎn)的持久化數(shù)據(jù)之后,可以以所獲取的持久化數(shù)據(jù)作為輸入數(shù)據(jù),從所確定的持久化代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)開始執(zhí)行。
沿用上一步驟中的例子加以說明,在獲取持久化代碼節(jié)點(diǎn)c代碼節(jié)點(diǎn)的持久化數(shù)據(jù)后,可以以該獲取的持久化數(shù)據(jù)作為輸入數(shù)據(jù),從所述持久化代碼節(jié)點(diǎn)c代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)即d代碼節(jié)點(diǎn)開始執(zhí)行。
通過本實(shí)施例,在代碼執(zhí)行過程中,通過對持久化代碼節(jié)點(diǎn)的輸出數(shù)據(jù)進(jìn)行持久化處理,如此在后續(xù)代碼節(jié)點(diǎn)出現(xiàn)異常后,可以獲取距離所述代碼節(jié)點(diǎn)最近的持久化代碼節(jié)點(diǎn)的持久化數(shù)據(jù),以所述持久化數(shù)據(jù)作為輸入數(shù)據(jù),從所述持久化代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)開始執(zhí)行。應(yīng)用本申請實(shí)施例中,在代碼執(zhí)行過程中代碼節(jié)點(diǎn)出現(xiàn)異常后,無需從頭開始執(zhí)行,從而提高了代碼執(zhí)行的效率。而且,隨著涉及到的數(shù)據(jù)量的增加,特別是大數(shù)據(jù)處理時,從頭開始執(zhí)行不僅極大的消耗系統(tǒng)資源還可能會出現(xiàn)代碼不可執(zhí)行的情況,應(yīng)用本實(shí)施例就可以減少系統(tǒng)資源的消耗,避免了代碼不可執(zhí)行的情況。
參見圖5,為本申請一實(shí)施例提供的代碼執(zhí)行方法的流程圖,所述方法可以包括以下步驟:
步驟210:根據(jù)預(yù)設(shè)規(guī)則對待執(zhí)行的代碼進(jìn)行解析,從而得到所述代碼中每一個代碼節(jié)點(diǎn)所屬的依賴關(guān)系,所述依賴關(guān)系包括流依賴、映射依賴和打亂依賴。
本實(shí)施例中,所述預(yù)設(shè)規(guī)則包括:
在代碼節(jié)點(diǎn)的輸入數(shù)據(jù)只來自一個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù)的情況下,確定所述代碼節(jié)點(diǎn)屬于流依賴;
在代碼節(jié)點(diǎn)的輸入數(shù)據(jù)至少來自兩個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù),并且該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)一一對應(yīng)輸入數(shù)據(jù)的情況下,確定所述代碼節(jié)點(diǎn)屬于映射依賴;
在代碼節(jié)點(diǎn)的輸入數(shù)據(jù)至少來自兩個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù),并且該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)不一一對應(yīng)輸入數(shù)據(jù)的情況下,確定所述代碼節(jié)點(diǎn)屬于打亂依賴。
以下舉例說明,某待執(zhí)行的代碼,根據(jù)預(yù)設(shè)規(guī)則對其進(jìn)行解析后可以得到如圖4所示的代碼節(jié)點(diǎn)拓?fù)鋱D,這里詳細(xì)說下解析過程:
首先,根據(jù)代碼節(jié)點(diǎn)的運(yùn)行邏輯:首先執(zhí)行a代碼節(jié)點(diǎn);之后,執(zhí)行b、c代碼節(jié)點(diǎn);之后,執(zhí)行d、e代碼節(jié)點(diǎn);之后,執(zhí)行f代碼節(jié)點(diǎn);最后執(zhí)行h代碼節(jié)點(diǎn)。根據(jù)預(yù)設(shè)規(guī)則,確定b代碼節(jié)點(diǎn)屬于流依賴:確定d代碼節(jié)點(diǎn)屬于打亂依賴;確定f代碼節(jié)點(diǎn)屬于映射依賴;確定h代碼節(jié)點(diǎn)屬于流依賴。由于a、c、e代碼節(jié)點(diǎn)屬于初始代碼節(jié)點(diǎn)不屬于任何依賴。
步驟220:在執(zhí)行每一個代碼節(jié)點(diǎn)后,判斷該代碼節(jié)點(diǎn)是否為持久化代碼節(jié)點(diǎn)。
本實(shí)施例中,所述持久化代碼節(jié)點(diǎn)包括屬于打亂依賴的代碼節(jié)點(diǎn)。
具體地,在所述代碼節(jié)點(diǎn)屬于打亂依賴的情況下,執(zhí)行步驟230。
本實(shí)施例中,在代碼執(zhí)行時,所述代碼執(zhí)行設(shè)備通過判斷所述代碼節(jié)點(diǎn)是否屬于打亂依賴,在確定所述代碼節(jié)點(diǎn)屬于打亂依賴的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
在一個可選的實(shí)施例中,所述持久化節(jié)點(diǎn)還可以是具有預(yù)設(shè)的持久化標(biāo)識的代碼節(jié)點(diǎn)。
具體地,在所述代碼節(jié)點(diǎn)具有預(yù)設(shè)的持久化標(biāo)識的情況下,執(zhí)行步驟230。
本實(shí)施例中,用戶可以人為預(yù)先對代碼節(jié)點(diǎn)配置持久化標(biāo)識,例如某個代碼節(jié)點(diǎn)處理數(shù)據(jù)比較復(fù)雜,輸出數(shù)據(jù)比較重要,那么用戶就可以對該代碼節(jié)點(diǎn)配置一個持久化標(biāo)識;當(dāng)然用戶也可以對該代碼節(jié)點(diǎn)不設(shè)置持久化標(biāo)識,這里只是給用戶增加了一個選項。如此,在代碼執(zhí)行時,所述代碼執(zhí)行設(shè)備通過判斷所述代碼節(jié)點(diǎn)是否具有持久化標(biāo)識,在確定所述代碼節(jié)點(diǎn)具有持久化標(biāo)識的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
在一個可選的實(shí)施例中,所述持久化節(jié)點(diǎn)還可以是最后一個的代碼節(jié)點(diǎn)。
具體地,在所述代碼節(jié)點(diǎn)為最后一個代碼節(jié)點(diǎn)的情況下,執(zhí)行步驟230。
本實(shí)施例中,代碼執(zhí)行設(shè)備還可以判斷所述代碼節(jié)點(diǎn)是否為最后一個代碼節(jié)點(diǎn),在所述代碼節(jié)點(diǎn)為最后一個代碼節(jié)點(diǎn)的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
步驟230:如果是,則持久化該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
通過本實(shí)施例,在代碼執(zhí)行過程中,通過對持久化代碼節(jié)點(diǎn)的輸出數(shù)據(jù)進(jìn)行持久化處理,用于前述代碼異常處理的實(shí)施例,即在后續(xù)代碼節(jié)點(diǎn)出現(xiàn)異常后,獲取距離所述代碼節(jié)點(diǎn)最近的持久化代碼節(jié)點(diǎn)的持久化數(shù)據(jù),以所述持久化數(shù)據(jù)作為輸入數(shù)據(jù),從所述持久化代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)開始執(zhí)行。
以下結(jié)合圖4所示的一個代碼節(jié)點(diǎn)拓?fù)鋱D加以說明,其中,包括a代碼節(jié)點(diǎn)、b代碼節(jié)點(diǎn)、c代碼節(jié)點(diǎn)、d代碼節(jié)點(diǎn)、e代碼節(jié)點(diǎn)、f代碼節(jié)點(diǎn)及h代碼節(jié)點(diǎn)。
假設(shè)a代碼節(jié)點(diǎn)的輸入數(shù)據(jù)為Assembly1;b代碼節(jié)點(diǎn)的輸入數(shù)據(jù)為Assembly2;c代碼節(jié)點(diǎn)的輸入數(shù)據(jù)為Assembly3。
開始執(zhí)行代碼,執(zhí)行a代碼節(jié)點(diǎn)(對輸入數(shù)據(jù)Assembly1進(jìn)行處理后輸出數(shù)據(jù)Assembly1’);
a代碼節(jié)點(diǎn)執(zhí)行完畢后,由于b代碼節(jié)點(diǎn)與a代碼節(jié)點(diǎn)之間為流依賴,執(zhí)行b代碼節(jié)點(diǎn)(對輸入數(shù)據(jù)Assembly1’進(jìn)行處理后輸出數(shù)據(jù)Assembly1”);
b代碼節(jié)點(diǎn)執(zhí)行完畢后,由于d代碼節(jié)點(diǎn)與b代碼節(jié)點(diǎn)、c代碼節(jié)點(diǎn)之間為打亂依賴,等待c代碼節(jié)點(diǎn)執(zhí)行完畢;
執(zhí)行c代碼節(jié)點(diǎn)(對輸入數(shù)據(jù)Assembly2進(jìn)行處理后輸出數(shù)據(jù)Assembly2’);
b代碼節(jié)點(diǎn)、c代碼節(jié)點(diǎn)都執(zhí)行完畢后,執(zhí)行d代碼節(jié)點(diǎn)(對輸入數(shù)據(jù)Assembly1”及Assembly2’進(jìn)行處理后輸出數(shù)據(jù)Assembly1”2’),由于d代碼節(jié)點(diǎn)屬于打亂依賴,持久化輸出數(shù)據(jù)Assembly1”2’;
d代碼節(jié)點(diǎn)執(zhí)行完畢后,由于f代碼節(jié)點(diǎn)與d代碼節(jié)點(diǎn)、e代碼節(jié)點(diǎn)之間為映射依賴,等待e代碼節(jié)點(diǎn)執(zhí)行完畢;
執(zhí)行e代碼節(jié)點(diǎn)(對輸入數(shù)據(jù)Assembly3進(jìn)行處理后輸出Assembly3’);
d代碼節(jié)點(diǎn)、e代碼節(jié)點(diǎn)都執(zhí)行完畢后,執(zhí)行f代碼節(jié)點(diǎn)(對輸入數(shù)據(jù)Assembly1”2’及Assembly3’進(jìn)行處理后輸出數(shù)據(jù)Assembly1”2’3’);
f代碼節(jié)點(diǎn)執(zhí)行完畢后,由于h代碼節(jié)點(diǎn)與f代碼節(jié)點(diǎn)之間為流依賴,執(zhí)行h代碼節(jié)點(diǎn)(對輸入數(shù)據(jù)Assembly1”2’3’進(jìn)行處理后輸出數(shù)據(jù)Assembly),并且由于h代碼節(jié)點(diǎn)是結(jié)束代碼節(jié)點(diǎn),持久化h代碼節(jié)點(diǎn)的輸出數(shù)據(jù)Assembly,所述代碼執(zhí)行完畢。
假設(shè)執(zhí)行到h代碼節(jié)點(diǎn)時出現(xiàn)異常,那么代碼執(zhí)行設(shè)備只需獲取距離h代碼節(jié)點(diǎn)最近的持久化代碼節(jié)點(diǎn)即d代碼節(jié)點(diǎn)的持久化數(shù)據(jù)Assembly1”2’;以所述持久化數(shù)據(jù)Assembly1”2’作為輸入數(shù)據(jù),從d代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)即f代碼節(jié)點(diǎn)開始執(zhí)行。
假設(shè)f代碼節(jié)點(diǎn)具有持久化標(biāo)識,那么持久化輸出數(shù)據(jù)Assembly1”2’3’;如此在h代碼節(jié)點(diǎn)出現(xiàn)異常后,代碼執(zhí)行設(shè)備只需獲取距離h代碼節(jié)點(diǎn)最近的持久化代碼節(jié)點(diǎn)即f代碼節(jié)點(diǎn)的持久化數(shù)據(jù)Assembly1”2’3’;以所述持久化數(shù)據(jù)Assembly1”2’3’作為輸入數(shù)據(jù),從f代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)即h代碼節(jié)點(diǎn)開始執(zhí)行。
與前述代碼異常處理方法實(shí)施例相對應(yīng),本申請還提供了代碼異常處理裝置的實(shí)施例。
本申請代碼異常處理裝置的實(shí)施例可以分別應(yīng)用在代碼執(zhí)行設(shè)備上。裝置實(shí)施例可以通過軟件實(shí)現(xiàn),也可以通過硬件或者軟硬件結(jié)合的方式實(shí)現(xiàn)。以軟件實(shí)現(xiàn)為例,作為一個邏輯意義上的裝置,是通過其所在設(shè)備的處理器將非易失性存儲器中對應(yīng)的計算機(jī)程序指令讀取到內(nèi)存中運(yùn)行形成的。從硬件層面而言,如圖6所示,為本申請代碼異常處理裝置所在設(shè)備的一種硬件結(jié)構(gòu)圖,除了圖6所示的處理器、網(wǎng)絡(luò)接口、內(nèi)存以及非易失性存儲器之外,實(shí)施例中裝置所在的設(shè)備通常根據(jù)該代碼異常處理的實(shí)際功能,還可以包括其他硬件,對此不再贅述。
參見圖7,為本申請一實(shí)施例提供的代碼異常處理裝置的模塊圖,所述裝置包括:確定單元300、獲取單元310和執(zhí)行單元320。
其中,所述確定單元300,在代碼節(jié)點(diǎn)出現(xiàn)異常后,確定與該代碼節(jié)點(diǎn)距離最近的持久化代碼節(jié)點(diǎn);其中,所述持久化代碼節(jié)點(diǎn)為具有持久化數(shù)據(jù)的代碼節(jié)點(diǎn);
所述獲取單元310,獲取該持久化代碼節(jié)點(diǎn)的持久化數(shù)據(jù);
所述執(zhí)行單元320,以所獲取的持久化數(shù)據(jù)作為輸入數(shù)據(jù),從所確定的持久化代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)開始執(zhí)行。
在一個可選的實(shí)現(xiàn)方式中:
所述持久化數(shù)據(jù)通過如下方式中的至少一種生成:
第一持久化單元,確定代碼節(jié)點(diǎn)與前一級代碼節(jié)點(diǎn)之間為流依賴的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù);其中,所述流依賴是代碼節(jié)點(diǎn)的輸入數(shù)據(jù)只來自一個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù);
第二持久化單元,確定代碼節(jié)點(diǎn)與前一級代碼節(jié)點(diǎn)之間為映射依賴的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù);其中,所述映射依賴是代碼節(jié)點(diǎn)的輸入數(shù)據(jù)至少來自兩個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù),并且該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)一一對應(yīng)輸入數(shù)據(jù);
第三持久化單元,確定代碼節(jié)點(diǎn)與前一級代碼節(jié)點(diǎn)之間為打亂依賴的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù);其中,所述打亂依賴是代碼節(jié)點(diǎn)的輸入數(shù)據(jù)至少來自兩個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù),并且該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)不一一對應(yīng)輸入數(shù)據(jù)。
在一個可選的實(shí)現(xiàn)方式中:
所述持久化數(shù)據(jù)通過如下方式生成:
第四持久化單元,確定代碼節(jié)點(diǎn)具有持久化標(biāo)識的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
在一個可選的實(shí)現(xiàn)方式中:
所述持久化數(shù)據(jù)通過如下方式生成:
第五持久化單元,確定代碼節(jié)點(diǎn)為最后一個代碼節(jié)點(diǎn)的情況下,持久化所述代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
與前述代碼執(zhí)行方法實(shí)施例相對應(yīng),本申請還提供了代碼執(zhí)行裝置的實(shí)施例。
本申請代碼執(zhí)行裝置的實(shí)施例可以分別應(yīng)用在代碼執(zhí)行設(shè)備上。裝置實(shí)施例可以通過軟件實(shí)現(xiàn),也可以通過硬件或者軟硬件結(jié)合的方式實(shí)現(xiàn)。以軟件實(shí)現(xiàn)為例,作為一個邏輯意義上的裝置,是通過其所在設(shè)備的處理器將非易失性存儲器中對應(yīng)的計算機(jī)程序指令讀取到內(nèi)存中運(yùn)行形成的。從硬件層面而言,如圖8所示,為本申請代碼執(zhí)行裝置所在設(shè)備的一種硬件結(jié)構(gòu)圖,除了圖8所示的處理器、網(wǎng)絡(luò)接口、內(nèi)存以及非易失性存儲器之外,實(shí)施例中裝置所在的設(shè)備通常根據(jù)該代碼執(zhí)行的實(shí)際功能,還可以包括其他硬件,對此不再贅述。
參見圖9,為本申請一實(shí)施例提供的代碼執(zhí)行裝置的模塊圖,所述裝置包括:解析單元400、判斷單元310和持久化單元320。
其中,所述解析單元400,根據(jù)預(yù)設(shè)規(guī)則對待執(zhí)行的代碼進(jìn)行解析,從而得到所述代碼中每一個代碼節(jié)點(diǎn)所屬的依賴關(guān)系,所述依賴關(guān)系包括流依賴、映射依賴和打亂依賴;
所述判斷單元410,在執(zhí)行每一個代碼節(jié)點(diǎn)后,判斷該代碼節(jié)點(diǎn)是否為持久化代碼節(jié)點(diǎn);
所述持久化單元420,在該代碼節(jié)點(diǎn)要進(jìn)行持久化處理的情況下,持久化該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)。
在一個可選的實(shí)現(xiàn)方式中:
所述預(yù)設(shè)規(guī)則包括:
在代碼節(jié)點(diǎn)的輸入數(shù)據(jù)只來自一個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù)的情況下,確定所述代碼節(jié)點(diǎn)屬于流依賴;
在代碼節(jié)點(diǎn)的輸入數(shù)據(jù)至少來自兩個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù),并且該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)一一對應(yīng)輸入數(shù)據(jù)的情況下,確定所述代碼節(jié)點(diǎn)屬于映射依賴;
在代碼節(jié)點(diǎn)的輸入數(shù)據(jù)至少來自兩個上一級代碼節(jié)點(diǎn)的輸出數(shù)據(jù),并且該代碼節(jié)點(diǎn)的輸出數(shù)據(jù)不一一對應(yīng)輸入數(shù)據(jù)的情況下,確定所述代碼節(jié)點(diǎn)屬于打亂依賴。
在一個可選的實(shí)現(xiàn)方式中:
所述持久化代碼節(jié)點(diǎn)包括屬于打亂依賴的代碼節(jié)點(diǎn);
或者,
具有預(yù)設(shè)的持久化標(biāo)識的代碼節(jié)點(diǎn);
或者,
最后一個的代碼節(jié)點(diǎn)。
通過本實(shí)施例,在代碼執(zhí)行過程中,通過對持久化代碼節(jié)點(diǎn)的輸出數(shù)據(jù)進(jìn)行持久化處理,如此在后續(xù)代碼節(jié)點(diǎn)出現(xiàn)異常后,可以獲取距離當(dāng)前代碼節(jié)點(diǎn)最近的持久化代碼節(jié)點(diǎn)的持久化數(shù)據(jù),以所述持久化數(shù)據(jù)作為輸入數(shù)據(jù),從所述持久化代碼節(jié)點(diǎn)后一個代碼節(jié)點(diǎn)開始執(zhí)行。應(yīng)用本申請實(shí)施例中,在代碼執(zhí)行過程中代碼節(jié)點(diǎn)出現(xiàn)異常時,無需從頭開始執(zhí)行,從而提高了代碼執(zhí)行的效率。而且,隨著涉及到的數(shù)據(jù)量的增加,特別是大數(shù)據(jù)處理時,從頭開始執(zhí)行不僅極大的消耗系統(tǒng)資源還可能會出現(xiàn)代碼不可執(zhí)行的情況,應(yīng)用本實(shí)施例就可以減少系統(tǒng)資源的消耗,避免了代碼不可執(zhí)行的情況。
上述裝置中各個單元的功能和作用的實(shí)現(xiàn)過程具體詳見上述方法中對應(yīng)步驟的實(shí)現(xiàn)過程,在此不再贅述。
對于裝置實(shí)施例而言,由于其基本對應(yīng)于方法實(shí)施例,所以相關(guān)之處參見方法實(shí)施例的部分說明即可。以上所描述的裝置實(shí)施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上。可以根據(jù)實(shí)際的需要選擇其中的部分或者全部模塊來實(shí)現(xiàn)本申請方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實(shí)施。
本領(lǐng)域技術(shù)人員在考慮說明書及實(shí)踐這里公開的發(fā)明后,將容易想到本申請的其它實(shí)施方案。本申請旨在涵蓋本申請的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本申請的一般性原理并包括本申請未公開的本技術(shù)領(lǐng)域中的公知常識或慣用技術(shù)手段。說明書和實(shí)施例僅被視為示例性的,本申請的真正范圍和精神由下面的權(quán)利要求指出。
應(yīng)當(dāng)理解的是,本申請并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并且可以在不脫離其范圍進(jìn)行各種修改和改變。本申請的范圍僅由所附的權(quán)利要求來限制。