0

我對每輛車我做一些遷移作業Vehicles..and名單..Parallel.Foreach VS的foreach用於數據遷移過程

foreach (vehicles) 
{ 

1 : Do database table migration for that vehicle 
2 : Call an API and save them to database 

} 

爲了提高我使其平行樣的表現:

Parallel.Foreach(vehicles) 
{ 
--same 
} 
  1. 這是正確的做法?因爲我的理解是,它會爲每個請求的車輛創建新的線程,並且應該快速運行。

  2. 將使並行任務提高很多?

  3. 保持最大的並行度是否很好?如果是,如何決定這個因素?

+0

看一看[這](http://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&cad=rja&ved=0CFAQFjAE&url=http%3A%2F %2Fdownload.microsoft.com%2Fdownload%2FB%2FC%2FF%2FBCFD4868-1354-45E3-B71B-B851CD78733D%2FWhenToUseParallelForEachOrPLINQ.pdf&EI = 1a5nUtL0HcrX0QXA84GYAg&USG = AFQjCNEPIq11VZKlic-cw6qK-Hw2bGWmng&SIG2 = zFCYLSUg7U4OQbXKZSD8kQ&BVM = bv.55123115,d.d2k) –

+0

@huMptyduMpty - 感謝鏈接..它似乎我在正確的軌道然後......可以幫助我的第三點 – Akon

+0

我不是很清楚你的意思*最大數量的pallellism *。請解釋? –

回答

2
  1. 方法是確定的,只是確保你的函數1和2是線程安全的(不共享公共資源,或至少同步它們的用法)

  2. 大概這取決於什麼的瓶頸是,例如如果你只有一個CPU,並且你的問題有CPU作爲瓶頸平行化不會給你帶來任何東西。如果您擁有多個內核(CPU)而不是CPU限制問題,那麼並行化將非常有益。 在你的情況下,這個限制也可以是你遷移數據的數據庫,它的泛濫甚至會讓它變得更糟。

  3. 再次取決於你所擁有的瓶頸,如果是CPU的並行度高於你的CPU核心數是不會帶給你任何東西的,那麼它會相反減慢線程切換的速度會吃掉資源。作爲一個經驗法則,我主要選擇核心數量爲1的CPU有限的問題,這樣系統的其餘部分仍然可以響應。

對於foreach循環內的小型甚至簡單工作負載,初始化Parallel.Foreach的開銷也可能會消耗其好處。

一般來說,試一試並根據情況來決定。

+0

感謝您提供這些很棒的建議。我會注意到我們在生產服務器中使用的CPU核心。它是如何影響內存的? – Akon

5
  1. 如果您在每個Vehicle項目之間很少或沒有依賴關係,那麼這是正確的方法。換句話說,您(理想情況下)在Action的主體中不應該有任何lock(或其他同步原語)在每個Vehicle上執行。但是,如果你在你的代碼有lock S,它們應該在執行比該方法的其他顯著更快的代碼的一部分:

    Parallel.ForEach(vehicles, v => 
    { 
        // Some code that takes long to execute 
        lock(_syncRoot) 
        { 
         _totalProcessedVehicles ++; 
        } 
    }) 
    

    Parallel.ForeachVehicle實例創建一個線程 - 它會產生幾個線程,並會給每個線程一大堆你的集合進行處理。線程的數量取決於您的硬件和可用資源。

  2. 編號Parallel.Foreach在內部使用Task,這樣做會增加代碼開銷的負擔。此外,使用與上述相同的邏輯在不同的線程上調度和執行任務:每個線程處理大塊Task s。

  3. 我不會推薦指定最大並行度 - 讓CLR爲你做;在絕大多數情況下,它會做得很好。但是,如果想要限制並行度,那麼Parallel.Foreach會有一個過載,它接受ParallelOptions類型的參數。使用屬性MaxDegreeOfParallelism來限制並行度。

+0

謝謝你可以解釋一下更多的..它會產生幾個線程,並會給每個線程的一大塊你的集合處理 - 是不是像..它會爲每個車輛創建許多線程? – Akon

+0

CLR傾向於對CPU約束工作使用多少個線程做出合理的決定。但訪問數據庫不受CPU限制,因此設置MaxDegreeOfParallelism可能是一個好主意。 – svick

+0

是的..實際..我只是不知道如何得到MaxDegree的價值..目前我在本地測試= 4 – Akon