線程組織方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)計(jì)算資源調(diào)度領(lǐng)域,特別是涉及到計(jì)算機(jī)網(wǎng)絡(luò)運(yùn)算應(yīng)用技術(shù)領(lǐng)域。
【背景技術(shù)】
[0002]網(wǎng)絡(luò)爬蟲,是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本。根據(jù)設(shè)計(jì)者的設(shè)計(jì)目的,網(wǎng)絡(luò)爬蟲可以被實(shí)現(xiàn)為各種形式,往往網(wǎng)絡(luò)爬蟲的實(shí)現(xiàn)方式都會(huì)采用多線程技術(shù),并且其線程的設(shè)計(jì)往往會(huì)有復(fù)雜的循環(huán)運(yùn)算,這些情況都導(dǎo)致網(wǎng)絡(luò)爬蟲設(shè)計(jì)中對(duì)單個(gè)線程運(yùn)行狀況進(jìn)行管理的必要性。
[0003]另一方面,計(jì)算機(jī)線程,是程序執(zhí)行流的最小單元,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源。
[0004]多線程技術(shù)的一個(gè)很重要的組成部分是守護(hù)線程,守護(hù)線程和普通線程的區(qū)別在于,一旦一個(gè)進(jìn)程中所有普通線程均已運(yùn)行結(jié)束,則無(wú)論守護(hù)線程是否在運(yùn)行,進(jìn)程均會(huì)結(jié)束運(yùn)行。守護(hù)線程常常被用于對(duì)普通線程運(yùn)行的輔助功能。
[0005]穩(wěn)定核是一種通過(guò)將守護(hù)線程內(nèi)置于運(yùn)行線程運(yùn)行主體內(nèi)部,使線程之間進(jìn)行相互守護(hù),進(jìn)而使所有線程在進(jìn)程中形成一種集中運(yùn)行模式的稱呼。
[0006]穩(wěn)定核和傳統(tǒng)的處理并發(fā)程序的方式的區(qū)別在于,穩(wěn)定核將守護(hù)線程的任務(wù)工作內(nèi)置于普通工作線程,這樣一方面避免了守護(hù)線程自身運(yùn)行無(wú)監(jiān)督的矛盾,另一方面減少了在高并發(fā)下線程之間頻繁切換導(dǎo)致的延時(shí)。
[0007]如圖1所示,穩(wěn)定核由2部分組成,掛載點(diǎn)環(huán)路和線程回收區(qū)。掛載點(diǎn)是每個(gè)線程所對(duì)應(yīng)的運(yùn)行標(biāo)記對(duì)象,含有線程運(yùn)行的信息。對(duì)線程進(jìn)行檢查等操作均是通過(guò)掛載點(diǎn)作為中介進(jìn)行的。
[0008]掛載點(diǎn)環(huán)路的結(jié)構(gòu)如圖2所示。其中1、2、3、4、5、6、7、8為8個(gè)線程對(duì)應(yīng)的掛載點(diǎn),這些掛載點(diǎn)在邏輯上處于一個(gè)鏈?zhǔn)降南群箨P(guān)系,前后相接組成一個(gè)環(huán)路。
[0009]而如圖3所示的線程回收區(qū)則可以用一個(gè)鏈?zhǔn)綊燧d點(diǎn)隊(duì)列組成,其僅僅對(duì)出問(wèn)題的掛載點(diǎn)進(jìn)行暫存,如若線程1、2、3的掛載點(diǎn)被放入回收區(qū),回收區(qū)的結(jié)構(gòu)則如圖3所示。正常運(yùn)行過(guò)程中,掛載點(diǎn)經(jīng)常在掛在點(diǎn)環(huán)路和線程回收區(qū)之間移動(dòng),如果線程故障被確診,則最終可以在線程回收區(qū)中被關(guān)閉和回收。
[0010]多線程網(wǎng)絡(luò)爬蟲在運(yùn)行過(guò)程中經(jīng)常由于網(wǎng)絡(luò)信息的變化和爬取策略的頻繁轉(zhuǎn)換而陷入一些危險(xiǎn)代碼而導(dǎo)致“假死”的現(xiàn)象,這類情況往往檢查起來(lái)費(fèi)時(shí)費(fèi)力又不具有通用性。
【發(fā)明內(nèi)容】
[0011]鑒于此,本發(fā)明的目的在于克服現(xiàn)有技術(shù)中多線程網(wǎng)絡(luò)爬蟲在運(yùn)行過(guò)程中經(jīng)常由于網(wǎng)絡(luò)信息的變化和爬取策略的頻繁轉(zhuǎn)換而陷入一些危險(xiǎn)代碼而導(dǎo)致“假死”的現(xiàn)象等問(wèn)題,提出一種線程組織方法,借助一種具有通用性的穩(wěn)定核技術(shù)來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲的運(yùn)行穩(wěn)定性的提升,能夠大大提尚網(wǎng)絡(luò)爬蟲線程的運(yùn)彳丁穩(wěn)定性。
[0012]為了實(shí)現(xiàn)此目的,本發(fā)明采取的技術(shù)方案為如下。
[0013]一種線程組織方法,所述方法包括步驟:
[0014]A:掛載點(diǎn)環(huán)路上一線程對(duì)其下一線程進(jìn)行運(yùn)行監(jiān)測(cè),檢查有無(wú)故障,若有故障,將問(wèn)題線程從從掛載點(diǎn)環(huán)路上摘下送入線程回收區(qū),并判斷所述故障是否是非首次發(fā)生,
[0015]其中若所述故障屬于非首次發(fā)生,則將所述下一線程任務(wù)標(biāo)記為問(wèn)題任務(wù),問(wèn)題任務(wù)不再執(zhí)行,
[0016]若所述故障屬于首次發(fā)生,則直接進(jìn)入步驟B ;
[0017]B、判斷是否需要執(zhí)行全局任務(wù),
[0018]若有回收任務(wù)則執(zhí)行回收任務(wù),回收所有線程回收區(qū)內(nèi)的線程,并將沒有問(wèn)題任務(wù)標(biāo)記的任務(wù)加入復(fù)活任務(wù)清單,
[0019]若無(wú)回收任務(wù)則進(jìn)入步驟C ;
[0020]C、判斷復(fù)活任務(wù)清單中是否有需要復(fù)活的任務(wù),若有則生成新線程執(zhí)行該任務(wù)。
[0021]另外,所述步驟A之前進(jìn)一步包括:
[0022]A01、啟動(dòng)多線程爬蟲系統(tǒng);
[0023]A02、初始化多線程爬蟲和數(shù)據(jù)庫(kù)的連接,以及檢查爬蟲運(yùn)行所需的數(shù)據(jù)庫(kù)是否有效;
[0024]A03、系統(tǒng)加載共享資源;
[0025]A04、系統(tǒng)在線程池中生成多個(gè)線程,每個(gè)線程獨(dú)立解析出二級(jí)入口 ;
[0026]A05、每個(gè)線程將自己獲得的二級(jí)入口送入公共過(guò)濾器,選出不重復(fù)的二級(jí)入口 ;
[0027]A06、在線程池中生成新的線程對(duì)二級(jí)入口進(jìn)行爬取和解析,并將結(jié)果存入數(shù)據(jù)庫(kù)。
[0028]其中利用分布式一致性方法確定負(fù)責(zé)所述下一線程的回收任務(wù)的全局計(jì)算線程。
[0029]并且利用公共布隆過(guò)濾器選出不重復(fù)的二級(jí)入口。
[0030]通過(guò)采用本發(fā)明的線程組織方法,利用線程之間的相互通信構(gòu)造了一種穩(wěn)定核結(jié)構(gòu),進(jìn)程通過(guò)構(gòu)造穩(wěn)定核可以實(shí)現(xiàn)對(duì)進(jìn)程中關(guān)鍵工作線程的運(yùn)行實(shí)現(xiàn)自動(dòng)化監(jiān)控,大大提高了工作線程的運(yùn)行穩(wěn)定性。同時(shí)采取穩(wěn)定核所提供的標(biāo)準(zhǔn)化調(diào)用接口,也避免了單獨(dú)設(shè)計(jì)關(guān)鍵工作線程的守護(hù)線程所耗費(fèi)的時(shí)間和精力,提高了軟件開發(fā)效率。
【附圖說(shuō)明】
[0031]圖1是穩(wěn)定核的結(jié)構(gòu)示意圖。
[0032]圖2是穩(wěn)定核中的掛載點(diǎn)環(huán)路的結(jié)構(gòu)示意圖。
[0033]圖3是穩(wěn)定核中的線程回收區(qū)的結(jié)構(gòu)示意圖。
[0034]圖4是本發(fā)明【具體實(shí)施方式】中線程組織方法的流程示意圖。
[0035]圖5是本發(fā)明【具體實(shí)施方式】中線程組織方法的流程示意圖。
[0036]圖6a_6d是本發(fā)明【具體實(shí)施方式】中穩(wěn)定核的掛載點(diǎn)環(huán)路和線程回收區(qū)的示意圖。
【具體實(shí)施方式】
[0037]下面結(jié)合附圖,對(duì)本發(fā)明作詳細(xì)說(shuō)明。
[0038]以下公開詳細(xì)的示范實(shí)施例。然而,此處公開的具體結(jié)構(gòu)和功能細(xì)節(jié)僅僅是出于描述示范實(shí)施例的目的。
[0039]然而,應(yīng)該理解,本發(fā)明不局限于公開的具體示范實(shí)施例,而是覆蓋落入本公開范圍內(nèi)的所有修改、等同物和替換物。在對(duì)全部附圖的描述中,相同的附圖標(biāo)記表示相同的元件。
[0040]同時(shí)應(yīng)該理解,如在此所用的術(shù)語(yǔ)“和/或”包括一個(gè)或多個(gè)相關(guān)的列出項(xiàng)的任意和所有組合。另外應(yīng)該理解,當(dāng)部件或單元被稱為“連接”或“耦接”到另一部件或單元時(shí),它可以直接連接或耦接到其他部件或單元,或者也可以存在中間部件或單元。此外,用來(lái)描述部件或單元之間關(guān)系的其他詞語(yǔ)應(yīng)該按照相同的方式理解(例如,“之間”對(duì)“直接之間”、“相鄰”對(duì)“直接相鄰”等)。
[0041]如圖4 一 5所示,本發(fā)明公開了一種線程組織方法,所述方法包括以下步驟:
[0042]A:掛載點(diǎn)環(huán)路上一線程對(duì)其下一線程進(jìn)行運(yùn)行監(jiān)測(cè),檢查有無(wú)故障,若有故障,將問(wèn)題線程從從掛載點(diǎn)環(huán)路上摘下送入線程回收區(qū),并判斷所述故障是否是非首次發(fā)生,
[0043]其中若所述故障屬于非首次發(fā)生,則將所述下一線程任務(wù)標(biāo)記為問(wèn)題任務(wù),問(wèn)題任務(wù)不再執(zhí)行,
[0044]若所述故障屬于首次發(fā)生,則直接進(jìn)入步驟B ;
[0045]B、判斷是否需要執(zhí)行全局任務(wù),
[0046]若有回收任務(wù)則執(zhí)行回收任務(wù),回收所有線程回收區(qū)內(nèi)的線程,并將沒有問(wèn)題任務(wù)標(biāo)記的任務(wù)加入復(fù)活任務(wù)清單,
[0047]若無(wú)回收任務(wù)則進(jìn)入步驟C ;
[0048]C、判斷復(fù)活任務(wù)清單中是否有需要復(fù)活的任務(wù),若有則生成新線程執(zhí)行該任務(wù)。
[0049]由于本發(fā)明利用線程之間的相互通信構(gòu)造了一種穩(wěn)定核結(jié)構(gòu),進(jìn)程通過(guò)構(gòu)造穩(wěn)定核可以實(shí)現(xiàn)對(duì)進(jìn)程中關(guān)鍵工作線程的運(yùn)行實(shí)現(xiàn)自動(dòng)化監(jiān)控,大大提高了工作線程的運(yùn)行穩(wěn)定性。同時(shí)采取穩(wěn)定核所提供的標(biāo)準(zhǔn)化調(diào)用接口,也避免了單獨(dú)設(shè)計(jì)關(guān)鍵工作線程的守護(hù)線程所耗費(fèi)的時(shí)間和精力,提高了軟件開發(fā)效率。
[0050]其中,