本系列學習在.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!
下集:反應式編程
寫給普通:
好好努力謙虛謹慎低調善良
該來的自然會來