本系列學習在.NET中的併發並行程式設計模式,實戰技巧
內容目錄
本小節開始學習資料並行的概念模式,以及在.NET中資料並行的實現方式。本系列保證最少程式碼呈現量,雖然talk is cheap, show me the code被奉為圭臬,我的學習習慣是,只學習知識點,程式碼不在當下立馬要用的時候不會認真去讀的,更何況在大多時候在手機閱讀更不順暢。
資料並行
資料並行是通過將資料集拆分為多個塊並獨立並行處理每個分割槽,將每塊分配給單獨的任務來實現。任務完成後,將重組資料集。就是拆分執行再重新組合的過程,這些資料塊通過同一個函式(任務)執行。
任務並行是從另一個視角來並行執,對一個資料集或多個資料集同時執行多個不同的函式(任務)。
Fork/Join模式
把大任務分割成若干小任務,最終歸總每個小任務結果後得到大任務結果的模式,先Fork後Join。Java中也有此模式的應用ForkJoinTask。在.NET中可以通過Parallel類中的Parallel.For迴圈輕鬆完成Fork/Join。
(在將資料集拆分的過程中,優化效能時,可以考慮結構型別代替引用型別。值型別分配在堆疊上,引用型別分配在堆上,會帶來記憶體分配和垃圾回收的開銷)
PLINQ
LINQ通過提高抽象級別並將引用程式簡化為一組豐富的操作來轉換任何實現了IEnumerable介面的物件以提供宣告式程式設計風格。最常見的操作時對映、排序和篩選。可以通過向查詢新增.AsParallel()擴充套件來將LINQ轉換為PLINQ。
編寫並行應用程式的最佳方法是不用考慮並行。即不需要你來拆分資料集分配執行緒任務。PLINQ完全適合這種開發模式,它底層自動實現Fork/Join模式,它比Parallel類庫中的並行方法更抽象,基本一句話告訴計算機你想要什麼結果,這也是宣告式程式設計風格的簡潔直觀。
PLINQ預設並不保證絕對並行執行。排程程式會衡量當前環境是否適合並行執行。但你需要強制並行時,可以通過Partitioner分割槽器來手動調整區分大小和分割槽策略。
to be contiued!
下集:反應式程式設計
寫給普通:
好好努力謙虛謹慎低調善良
該來的自然會來