並行程式設計隨記

匡匡發表於2017-08-14

.Net Framework 裡引入了並行程式設計,並行程式設計本質上還是多執行緒,只是微軟對此進行了封裝和優化,使用多執行緒程式設計變得更簡單,如下面一個例子:

for(var i = 0; i < 100000; i++)
{
    Console.WriteLine(string.Format("Work Item :", i));
}

如果把 100000 個工作項使用多個執行緒同時處理, 在以前還有點麻煩,現在就變得非常簡單:

Parallel.For(0, 100000, (i) => {
    Console.WriteLine(string.Format("Work Item :", i));
});

上面的程式碼中, 程式會根據任務項數自動分割槽(分割槽大概的意思就是分成幾個執行緒來同時處理)。

 

我們可以設定 ParallelOptions 物件,來設定最多分幾個區, 如:

ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 10; // 最多分十個區

Parallel.For(0, 100000, options, (i) => {
    Console.WriteLine(string.Format("Work Item :", i));
});

還可以通過 System.Collections.Concurrent.Partitioner 類來進行更細的分割槽設定, 如:

var parts = Partitioner.Create(0, 100000, 1000); // 1000 是指每個分割槽的元素數, 此行程式碼將指示建立 100 個分割槽
Parallel.For(parts, (i) => {
    Console.WriteLine(string.Format("Work Item :", i));
});

上面這些分割槽,叫做靜態分割槽,就是分好區之後,每個區要處理的元素就已經全部確定好,但是有這種情況,如有些分割槽的任務很快就處理完了,有些分割槽的任務處理得
比較慢, 那麼快的分割槽處理完分割槽的任務後沒有辦法幫助其他慢的分割槽處理任務,在這種情況下,又可以使用動態分割槽,具體實現方法可以參考微軟官網的例子:https://msdn.microsoft.com/zh-cn/library/dd997416(v=vs.110).aspx

 

還有一個 System.Collections.Concurrent.OrderablePartitioner 類,用來對可排序的資料來源進行分割槽。

 

相關參考:

Parallel Processing and Concurrency in the .NET Framework

5天玩轉C#並行和多執行緒程式設計 —— 第一天 認識Parallel

相關文章