張興國 王子影 劉 堅 何案華
(1)中國地震局地殼應力研究所,北京 100085 2)中國地震局地震研究所,武漢430071)
地震前兆數據多線程采集與多目標入庫應用研究*
張興國1)王子影1)劉 堅2)何案華1)
(1)中國地震局地殼應力研究所,北京 100085 2)中國地震局地震研究所,武漢430071)
利用可實例化的智能線程池技術,通過兩個線程池分別實現了前兆數據的并行數據采集與數據的多目標入庫,可自動實現對最近15天內的數據進行檢測與采集,采集儀器的數量由原來的幾臺、十幾臺提高到上千臺,大大提高了地震前兆數據的采集效率;通過數據的多目標入庫,數據由臺站到區域中心以及國家臺網中心的同步速度也得到很大提高。
多線程;智能線程池;地震前兆;多目標入庫;并行數據采集
前兆數據的采集主要由臺站一級負責,數據采集任務采用后臺多線程技術,臺站采集的數據定時同步到區域中心,區域中心定時同步到國家中心,再由國家中心同步到各學科中心。數據采集任務實現了一定數量的多線程并行采集,其數據的逐級定時同步機制優點是前兆儀器與各級服務器的負擔都較為均衡,缺點是數據采集與入庫機制不夠靈活,中間任何一級出現問題,數據的采集與入庫都會受到影響,有時還需要人工進行干預。
針對上述情況,本文采取地震前兆數據并行處理方案,即采用可實例化的智能線程池技術實現前兆數據的并行采集與數據的多目標入庫,由實例化的兩個線程池分別處理數據采集與數據入庫任務,利用智能線程池的復用技術將并行多線程的數量突破了常規的64個線程限制,采集任務并行處理的儀器數量達上千臺,全自動保持對最近15天的數據進行采集,多目標入庫并行處理、采集與入庫并行處理。該方案部署靈活,可部署在臺站、區域或國家中心任一級的普通PC機上,也可多機協調工作。
地震前兆數據采集的對象通常指一個臺站或一個區域所屬的全部前兆儀器,觀測手段多樣,所屬學科多樣,因此一般情況下數據采集軟件需要同時對多臺儀器進行數據采集。現行的地震前兆運行管理系統同樣采用后臺多線程技術進行數據采集,數據同步方式采用逐級定時同步。本文提出的地震前兆數據采集與多目標入庫方案,是針對以前地震前兆運行系統的不足進行了部分功能的改進,系統部署更加靈活,適用于任何普通PC機;數據采集采用智能線程池技術,具有高效的線程管理技術,突破了常規的多線程數量的限制,使得前兆儀器的并行采集數量得到非常大的提高;數據的多目標入庫也大大提高了臺站數據到所屬區域中心與國家中心的同步速度。
2.1 后臺多線程與線程池技術
對于單線程程序,如果直接在UI線程運行一個費時的方法,會引起程序“假死”,對用戶來講,非常不友好。這時就需要通過后臺多線程技術來解決,提高界面交互性能,方便用戶使用。
后臺多線程在c#中的實現方式有兩種:一是通過System.Threading.Thread類,創建多個新的線程,并置線程的屬性IsBackGround為真;二是通過System.Threading.ThreadPool(線程池)類,將費時任務提交到線程池中,等待運行。第一種方法,在多線程的重復使用中不便于進行控制,可能會導致線程的數量快速增大,影響系統性能。第二種方法,由線程池高效的線程管理機制來處理多任務,實現對線程的統一管理,從而能很好地控制多線程的重用,線程數量可得到有效控制。
2.1.1 CLR線程池
.NET環境有一個內置的CLR線程池,可以利用ThreadPool類中的靜態方法使用這個線程池。通過QueueUserWorkItem方法向線程池中添加任務,線程池就會負責在合適的時候執行它們。CLR線程池對線程的最大和最小數量作了限制,對線程創建時間作限制,以避免突發的大量任務消耗太多的資源。
CLR線程池的缺點:
1)不能實例化,只能存在一個線程池;
2)無法設定任務優先級;
3)WaitHandle方法傳遞的句柄不能超過64個,否則出現異常。
2.1.2 SmartThreadPool智能線程池
SmartThreadPool,智能線程池的特點如下:
1)可創建線程池實例;
2)可動態調整線程池工作線程數量;
3)WorkItem可以返回信息;
4)未執行WorkItem可被取消;
5)WorkItem執行時可使用調用者上下文;
6)調用者可等待多個或全部WorkItem執行結束;
7)WorkItem允許擁有一個執行結束時被執行的PostExecute回調委托;
8)可以向 WorkItem傳遞一個狀態對象,并且會在執行結束時自動調用IDisposable.Dispose();
9)WorkItem異常會傳遞給調用者;
10)支持WorkItem分組;
11)可掛起線程池或分組;
12)可以設置WorkItem優先級;
13)可以設置線程優先級;
由以上對比分析可看出,利用Thread類實現的多線程,當線程數量較多時,系統創建線程的費用很高,影響系統性能。CLR線程池WaitHandle方法存在64個句柄的限制,即當采集對象的總數超過64個就會彈出異常警告,且只能同時存在一個線程池。綜合以上因素我們選擇采用SmartThreadPool智能線程池技術。
2.2 多線程前兆數據采集與多目標入庫
多線程地震前兆數據采集與多目標入庫實現原理:利用SmartThreadPool的實例化特性創建兩個線程池實例,分別為數據采集線程池DataGatherPool、數據入庫線程池Data2LibPool,DataGatherPool用來實現對多個儀器最近15天數據的全自動采集,Data2LibPool負責對采集文件進行多目標入庫,由采集定時器與入庫定時器分別控制采集線程池的數據采集與入庫線程池的數據入庫工作(圖1)。
數據采集線程池大小可任意設定,綜合考慮各方面因素,線程池的大小以小于50為宜,當采集儀器數量較多時,線程池建立任務序列,等待空閑線程,一旦有空閑線程出現,就會按順序執行任務隊列中的任務,這樣通過線程池內線程的復用可實現對大量前兆儀器的數據采集,解決了WaitHandle傳遞句柄不能超過64個的限制瓶頸。經測試上千臺儀器的狀態獲取只需3~4分鐘且運行穩定。

圖1 地震前兆數據的多線程采集與入庫流程Fig.1 Flow chart of multi-threaded acquisition and storage of earthquake precursor data
數據入庫線程池可設為不大于10個線程,每一個文件作為一個對象占用線程池內的一個線程,當所有文件均入庫完畢,線程池即處于空閑狀態,可以關閉退出,等待下一次任務序列的到來。
2.2.1 多線程的地震前兆數據采集
多線程的地震前兆數據采集相比以前地震前兆運行管理系統所要解決的主要問題一是實現對大量前兆儀器的并行數據采集;二是任何時刻都可實現對最近15天內數據的全自動采集;三是可實現多機協調工作。通過SmartThreadPool的線程重用技術實現了對上千臺前兆儀器的全自動并行數據采集,利用線程池的復用實現定時任務。為保證線程池的重用和數據采集的正確性與完整性,采集線程工作流程如圖2所示。
多線程采集中的關鍵技術有如下4個方面:
1)多線程采集中的超時機制
為了保證線程池內的采集線程能夠正常退出或發生異常退出,采用兩種超時機制,一是socket超時機制,設定socket的發送與接收超時時間,當socket連接異常時靠系統自身的機制來觸發異常,強制關閉socket,退出采集線程。Socket接收超時時間根據儀器的采樣率自動調整,分鐘采樣的儀器,socket超時時間設置較小;秒采樣的儀器,socket超時設置較長一些。二是數據通信超時機制,所謂數據通信超時就是當采集模塊與儀器一直保持連接狀態,但在定時時間內沒有接收到任何數據,則認為socket異常,強制關閉socket連接,退出采集線程,作為第一種超時機制的補充,確保線程池的正常運轉。

圖2 地震前兆數據的多線程采集流程Fig.2 Flow chart of multi-threading acquisition of earthquake precursor data
2)多機協調采集狀態字的生成策略
采集狀態字的生成策略需要考慮多機協調、采集中斷等情況,采集狀態字以儀器為單位,首先,在本機原始文件路徑下統計最近15天已經采集到的數據文件情況,采集到文件記為1,未采集到文件記為0,生成一個0和1組成的15位狀態字,稱為狀態字a。由于數據采集采用即采即寫文件的方式,該統計狀態字內可能包含由于斷電、人為中斷等原因產生的不完整數據文件。其次,讀取參數服務器內該儀器的采集狀態字,包含多機采集的結果,該狀態字中為1說明該儀器該日的數據已經采集成功,稱為狀態字b。再次,讀取參數服務器內該儀器的入庫狀態字,包括多機采集與入庫的結果,狀態字中為1說明該儀器該日的數據已經成功入庫,稱為狀態字c。最后,將狀態字a與狀態字b按位相與,即本機已經采集到文件且參數服務器內標記成功采集的為1不再進行采集;本機有文件且參數服務器內標記未成功的為0,有兩種原因:一是程序中斷導致文件采集未完成,二是文件采集完成,由于程序中斷未及時更新參數服務器的采集狀態字,需要重新采集;本機無文件而參數服務器內標記采集成功的為0,需要采集;本機無文件且參數服務器內標記采集未成功的為0,需要采集。這樣得到一個新的狀態字稱為狀態字d,再將狀態字c與狀態字d按位進行或運算,即只要標記入庫成功的都不需要再采集,未入庫且需要采集的全部采集,得到最終需要的采集狀態字。
根據計算生成的最終采集狀態字,進行判斷最近15天內是否需要采集某一天的數據。該狀態字以最近15天采集入庫狀態為判斷對象,將單機與多機協調工作融合在一起,保證數據不會漏采,會存在小部分重采現象。
3)非正常文件的處理
為了減輕采集線程的負擔,對采集到的文件只進行初步的校驗,一是校驗文件格式的完整性,完整的采集接收文件都有ack結束標志,通過檢查接收文件是否具有ack標志,判定文件是否完整;二是校驗文件的大小,通常文件的內容都要大于幾十個字節,當接收文件的大小非常小時,也認為該文件不完整。文件的詳細校驗在入庫環節進行,通過初步檢驗,得到非正常文件,并把該文件移到非正常文件存放路徑,以備檢查之用。如果在后續的采集中,得到該天正常的采集文件,就會把非正常文件路徑下的對應文件刪除。
4)原始文件定時清理
采集到的原始數據與儀器工作日志文件先保存到原始數據文件路徑下,當采集成功后再復制到入庫路徑下,供入庫單元調用。當儀器數量較多時,原始數據路徑下的文件數量很大,生成狀態字時文件的檢索速度變慢,需要定時清理,每天定時清理該文件夾內的文件,只保留最近15天的原始數據,便于統計本地采集狀態字,也便于軟件的維護。
2.2.2 地震前兆數據的多目標入庫
地震前兆數據的多線程入庫可實現數據的多目標入庫,利用入庫定時器控制定時任務的啟動,首先,檢測入庫路徑下有無入庫文件,如果有文件存在,把文件作為任務對象添加到入庫線程池內。其次,對任務對象進行全面校驗,校驗文件命名格式、文件內容格式、文件大小、數據大小,如果文件不正常,被移入非正常文件路徑下,同時更新采集狀態字為未成功。最后,檢索該文件的入庫目標,將該文件逐個目標進行入庫。例如,可同時將該文件的入庫目標設為區域中心與國家臺網中心,使數據同步速度得到有效提高。入庫成功后,更新該文件所屬儀器的入庫狀態字,同時將該文件壓縮后移到本機備份數據路徑下,作為本機備份保留,同時檢測非正常文件路徑下是否含有該文件,若有則刪除。任一目標數據庫未入成功該文件仍保留在入庫路徑下,等待下次繼續入庫。入庫線程工作流程如圖3。

圖3 入庫線程工作流程Fig.3 Flow chart of warehousing thread work
多線程入庫中的關鍵技術有如下3個方面:
1)多目標入庫
通過在參數服務器設置儀器的入庫目標,可實現數據的多目標入庫,即每臺儀器對應多個目標數據庫,采集文件可同時存放到多個數據庫,實際應用時可根據需要設置儀器的入庫目標為區域中心數據庫與國家臺網中心數據庫,這樣可由臺站一級采集到數據后直接同步到區域中心和國家臺網中心,數據的同步更加及時和靈活,能滿足數據處理的即時需要。只有當該文件所屬儀器的多目標數據庫完全入成功,才表示入庫完成,文件壓縮后保存到備份數據路徑下;任何一個目標數據庫未入成功,返回的狀態均為入庫未成功,文件繼續存放在入庫路徑下,等待下次入庫調用,直到所有入庫目標均入庫成功。實際應用中特別注意,入庫目標向上選擇,禁止向下選擇大量的入庫目標,導致入庫效率下降,失去多目標入庫的意義。
2)數據壓縮備份
數據入庫成功后經過壓縮移到備份數據存放路徑下,按月存放,便于檢索。本地備份數據文件可用于日后數據的重新入庫或數據處理的需要,無需再由數據庫內獲取該數據文件,通過采集入庫模塊的備份數據提取功能,查找所需的數據文件。
3)備份數據重入庫與外部文件入庫
通過將備份路徑下的壓縮備份文件解壓縮后導入入庫路徑,可實現對備份數據的重入庫,用于解決數據庫損壞以及滿足不同數據庫的需要。對于通過其它途徑下載的數據文件,利用外部文件導入功能,轉化為本地入庫需要的格式后,即可實現外部文件的多目標入庫。
2.3 SmartThreadPool在多線程入庫中的應用實例
以數據的多線程入庫為例,介紹SmartThread-Pool的應用。
SmartThreadPool在c#中的應用步驟:
1)添加SmartThreadPool.dll引用;
2)程序內添加SmartThreadPool的命名空間引用;
3)實例化SmartThreadPool,同時初始化空閑超時時間與線程大小;
4)定義IWorkItemResult[]大小;
5)添加工作隊列到線程池;
6)WaitAll等待線程池空閑;
7)關閉線程池;
SmartThreadPool在數據多目標入庫中的實際應用:
SmartThreadPool smartDataLibPool=new Smart-ThreadPool(10* 1000,10,2);
//空閑超時10s,線程超過10s自動銷毀,最大線程數10,最小線程數2
int nCountOfFile=FileInfoArray.Length;
//得到入庫文件數
IWorkItemResult[] ResultOfDataLib = new IWorkItemResult[nCountOfFile];
//根據處理的對象數定義IWorkItemResult[]
for(int i=0;i<nCountOfFile;i++)
{
ResultOfDataLib[i]=smartDataLibPool.Queue-WorkItem(new WorkItemCallback(DataLibItem-Work),FileInfoArray[i]);
}
//添加任務隊列到線程池
SmartThreadPool.WaitAll(ResultOfDataLib);
//等待線程池空閑
smartDataLibPool.Shutdown();
//關閉線程池
其中回調函數DataLibItemWork就是實際應用的數據入庫函數,所有的入庫操作與處理均由該函數體完成,FileInfoArray[i]為每個入庫文件對象。
2.4 SmartThreadPool應用注意事項
1)添加命名空間的引用using Amib.Threading。
2)線程池內的線程由系統托管進行管理,任何一個線程出現死機或阻塞,均會導致線程池長期處于忙狀態,線程池不能關閉,從而不能實現線程池的復用,尤其在前兆數據的采集過程中,由于某個原因導致SOCKET阻塞,采集過程不能異常退出,結果導致整個線程池一直處于忙狀態。因此在采集程序中要充分考慮到各種因素可能造成的影響,處理好各種可能出現的異常,保證采集過程能夠正常退出或異常退出,線程池才能正常連續運轉。
3.1 多線程的地震前兆數據采集與多目標入庫技術應用
基于多線程的地震前兆數據采集與多目標入庫模塊的應用較為靈活,可部署在臺站、區域中心或國家中心任意一臺PC機上,用于臺站一級可以實現對臺站所屬前兆儀器進行全自動的數據采集,其入庫目標為臺站服務器以及臺站所屬區域中心與國家中心三個目標;用于區域一級可實現對區域所屬前兆儀器進行全自動的數據采集,其入庫目標通常為本區域服務器與國家中心服務器兩個目標;用于國家中心一級可實現有選擇地對某個區域內儀器或某些跨區域儀器進行數據采集,入庫目標為國家中心,也可根據需要自設定某些學科的儀器同時入學科中心;若需要進一步提高采集與入庫速度,也可利用多機協調工作。總之,對該模塊的應用比較靈活,入庫目標通常向上發展,數量不能過多,即臺站應用時入庫目標較多,區域應用時目標減少,按這種趨勢部署分配任務;入庫目標不能向下發展,通常禁止上級中心運行該模塊,同時設定入庫目標為所屬下級各臺站服務器或區域中心服務器這種運行方式,不能體現多目標入庫同步速度快的優點。
3.2 多線程的地震前兆數據采集與多目標入庫運行情況
經過運行測試,該采集入庫模塊可實現對上千臺前兆儀器進行數據采集,采集儀器的選擇方式靈活多樣,可按儀器、臺站、區域、采樣率進行選擇;可實現數據的多目標入庫,提高了由臺站到區域到國家中心的數據同步速度;實現了數據采集與入庫的動態顯示,方便用戶查看采集與入庫的進度與狀態;實現了對當前采集狀態、采集結果的統計功能。模塊的運行界面如圖4。
圖4左側圖形顯示區顯示的最近15天數據的采集與入庫情況,紅色表示還沒有采集到數據,亮綠色表示已經采集到數據,深綠色表示數據已經成功入庫,通過圖形可以非常直觀地顯示出數據的采集與入庫情況。
采集統計結果見圖5。
該方案可實現大量前兆儀器的并行數據采集,網絡故障在15天之內不影響數據的正常采集,多目標入庫可快速實現臺站、區域與國家中心的數據同步,數據采集與入庫的靈活性增強、效率得到很大提高。

圖4 地震前兆數據采集與入庫模塊主界面Fig.4 Main interface for earthquake precursor data acquisition and storage module

圖5 采集文件統計Fig.5 Files acquisition statistics
通過對現行地震前兆臺網運行管理系統在數據采集與數據入庫、數據同步等方面的學習與研究,結合日常應用中發現的問題和不足,提出了新的前兆數據并行采集與多目標入庫方案。新的前兆數據采集與入庫方案利用智能線程池技術實現了多儀器的并行采集、數據的多目標入庫、數據采集與入庫的并行運行。通過靈活地配置采集儀器,可滿足不同用戶的需求。在數據采集功能上,以最近15天的數據采集狀態為判斷標志,實現了對最近15天內數據的全自動采集,保證15天內總有一天能采集到數據。在數據入庫功能上,實現了采集數據的多目標入庫,采集來的數據直接保存到目標數據庫服務器,在一定程度上省去了中間的交換環節。另外,通過參數服務器的協調工作,還可實現多機并行工作,共同完成同一項采集與入庫任務,大大提高了數據采集與多目標入庫速度,加快了由臺站到區域到國家臺網中心的數據同步時間。工作方式更加靈活、使用更為方便,較以前臺網管理系統的串行機制在數據采集與入庫方面有了很大程度的改善。
1 劉鋼,郭晗,王振吉.基于Java的多核多線程編程技術[J].吉林建筑工程學院學報,2009,26(6):77-79,88
2 劉世德,王玉正,韓新強.Windows下實時數據采集的實現[J].中國制造業信息化(學術版),2009,39(10):52-53,57
3 Ami bar.Smart Thread Pool[DB/OL].http://www.codeproject.com/KB/threads/smartthreadpool.aspx.
4 Shawn Cicoria.Proper threading in winforms[DB/OL].NET.http://www.codeproject.com/KB/cs/winformthreading.aspx.2003.
PRACTICAL RESEARCH ON MULTI-THREADED ACQUISITION AND MULTI-OBJECTIVE INVENTORY OF EARTHQUAKE PRECURSOR DATA
Zhang Xingguo1),Wang Ziying1),Liu Jian2)and He Anhua1)
(1)Institute of Crustal Dynamics,CEA,Beijing 100085 2)Institute of Seismology,CEA,Wuhan430071)
The Smart Thread Pool technology is used to respectively achieve seismic precursor data acquisition in parallel and entering warehouse with multiple target by two Thread Pool,and automaticly achieve data detection and collection within 15 days,the quantity of equipments for data gathering originally from several pieces,over 10 machines or over thousands of equipments.Therefore this technique can increase efficiency for seismic precursor data gathering greatly.At the same time,by entering warehouse with multiple target,the synchronous speed enhanced greatly from seismic station to regional center or China Earthquake Networks Center.
multi-threaded;Smart Thread Pool;earthquake precursor;multi-objective storage;data acquisition in parallel
1671-5942(2011)Supp.-0132-06
2010-09-24
中央級公益性科研院所基本科研專項(ZDJ2009-02)
張興國,男,1973年生,工程師,研究方向:地震前兆應用軟件.E-mail:zxgllp@163.com
TP315
A