c#進階(1)—— Task Parallel Library 並行執行與串行執行
本文參考的博文出處:http://www.cnblogs.com/stoneniqiu/p/4857021.html
總體說明:
(1)、理解硬件線程和軟件線程
硬件線程也稱為邏輯內核,一個物理內核可以使用超線程技術提供多個硬件線程。所以一個硬件線程並不代表一個物理內核;Windows中每個運行的程序都是一個進程,每一個進程都會創建並運行一個或多個線程,這些線程稱為軟件線程。硬件線程就像是一條泳道,而軟件線程就是在其中遊泳的人。
(2)Net Framework4 引入了新的Task Parallel Library(任務並行庫,TPL),它支持數據並行、任務並行和流水線。讓開發人員應付不同的並行場合。
- 數據並行:有大量數據需要處理,並且必須對每一份數據執行同樣的操作。比如通過256bit的密鑰對100個Unicode字符串進行AES算法加密。
- 任務並行:通過任務並發運行不同的操作。例如生成文件散列碼,加密字符串,創建縮略圖。
- 流水線:這是任務並行和數據並行的結合體。
TPL引入了System.Threading.Tasks ,主類是Task,這個類表示一個異步的並發的操作,然而我們不一定要使用Task類的實例,可以使用Parallel靜態類。它提供了Parallel.Invoke, Parallel.For Parallel.Forecah 三個方法。
一、業務場景
目前在模擬工作中可能遇到的一個場景,從中間服務器讀取xml文件,分別為兩法刑事案件信息,兩法行政案件信息(目前模擬的兩個xml文件單詞導入的業務數據量在20000~30000條左右),對應兩張數據庫表為[Sys_TwoLawsConvergence_AdministrationCase]、[Sys_TwoLawsConvergence_PoliceCase],表結構及具體字段如下所示。
其中,主鍵並非為自增,主鍵的維護由對接應用系統統一提供(目前並未建立任何索引,後期準備深入研究一下 sql server 的 b樹索引及位圖索引)。
考慮到,同時向兩張數據表插入數據,除去使用多線程同時寫入外,.net framework 4.0 提供了新的Task Parallel Library(任務並行庫,TPL),它支持數據並行、任務並行和流水線。在此業務場景,我采用了最簡單的方法,及Parallel類的Invoke()方法,通過Stopwatch,準確測量並行執行插入數據與串行執行插入數據在執行效率上的對比。
二、具體實現
定義了NetCloudPoliceInsertData、NetCloudAdministrationInserData類,分別為兩法刑事案件信息寫入類及兩法行政案件信息寫入類具體結構及方法如下
(1)NetCloudPoliceInsertData類
其中DataAccessFactory.Instance().GetDataAccess("Sql Server");DataAccessFactory為自定義的數據訪問類,此處工廠模式保證工廠類對象在內存中有且僅有一個,每一次GetDataAccess()都會創建一個數據庫連接(非連接池的方式),寫入庫表的方式采用批量執行
(2)NetCloudAdministrationInserData類
三、並行執行與串行執行效率比較
(1) Execute
其中 Parallel靜態類的Invoke方法註釋為【盡可能並行執行提供的每個操作】,在輸出執行語句後,可以看到並行執行的執行效果,如下圖所示:
四、運行結果比較
並行執行結果時間:
串行執行結果時間:
並行執行在時間上比串行執行時間上少2分鐘左右,此次導入的數據量為20000條,後期會追加大數量的導入,以檢驗並行執行的效果。
c#進階(1)—— Task Parallel Library 並行執行與串行執行