2016-11-11 80 views
2

在我的應用程序中,我有許多類可以使用Parallel.For語句計算他們的任務。每個Parallel.For使用它自己的ParallelOption設置最大程度的並行性。線程池和Parallel.For組合 - 有可能

應用程序流程依賴於用戶設置,因此存在如下情況:類A(並行計算)調用類B(也可並行計算)或調用類C(即不使用任何並行計算)。

另一種模式是遞歸調用,在遞歸的每個級別上進行並行計算。

我的問題:

是否可以設置所使用的所有類來完成其calculatins全局線程池和線程的NUMER在全球範圍內控制了應用程序?

是否可以將線程池​​與Parallel.For結合使用,以便大部分現有代碼保持不變?

與獨立並行調用相比,線程池有多少開銷(我知道這一切都取決於,最終廣告我需要做一些測試,但也許你有一些好的和壞的過期以及好的建議)

回答

2

是否可以設置所使用的所有 類來完成其calculatins全局線程池和線程的NUMER控制 全球範圍內爲應用程序?

這已經是這種情況。目前,應用程序線程池由.NET運行時管理。所以你可以肯定地說,所有的類(在運行的應用程序中)都使用相同的線程池。您可以通過使用Task s,靜態ThreadPool類或靜態Parallel類來訪問線程池。

是否有可能將線程池與Parallel.For組合起來,因此大部分 現有代碼保持不變?

Parallel.For內部使用TasksTaskScheduler。所以,將使用相同的線程池。

+0

你知道如何控制線程池的大小嗎?如果使用MAXDOP = 10調用Parallel.For,然後在每個線程中調用另一個調用另一個與MAXDOP = 10的Parallel.For的方法,則有多少個線程。Is最大爲10 + 10 * 10? –

+0

@SebastianWidz,你不應該控制線程池的大小,你不能直接這樣做。 .NET運行時幾乎肯定可以更有效地做到這一點。你應該閱讀更多關於[並行循環](https://msdn.microsoft.com/en-us/library/ff963552.aspx)。在2核心系統上將並行度設置爲10可能會減慢整個過程。 – dymanoid

+0

是的,我知道過高的DOP會減慢速度,目前我設置了MAXDOP = Environment.ProcessorCount,但是當一個線程調用一個調用另一個並行循環的方法時會發生什麼情況 - 您會得到線程數量的乘積。這就是我問這個問題的原因。爲所有呼叫一起設置一個常數od線程是不方便的 –

0

Parallel.For默認情況下會使用所有線程池線程,並且線程池線程的數量已針對您的cpu進行了優化。 MaxDegreeOfParallelism僅在您想要而非使用給定循環的所有線程池線程時纔有用。

只需使用Parallel.For並且不要過度綁定它。

後來,如果你的應用真的需要它,你仍然可以用自己的線程池創建自己的TaskScheduler ......但實際上你很可能需要這樣做。