[英]best use of Parallel.ForEach / Multithreading
我需要從網站上抓取數據。 我需要訪問超過1,000個鏈接,之前我正在為每個線程划分10個鏈接,並且每個線程都會啟動100個線程。在幾個測試用例之后,100個線程是最小化檢索內容的時間的最佳計數所有的鏈接。
我意識到.NET 4.0提供了對開箱即用的多線程的更好支持,但這是基於你擁有多少個核心來完成的,在我的情況下它不會產生足夠的線程。 我想我要問的是:什么是優化1,000鏈路拉動的最佳方法。 我是否應該使用.ForEach
並讓Parallel
擴展控制產生的線程數量,或者找到一種方法來告訴它啟動多少線程並分割工作?
我之前沒有使用過Parallel
,所以也許我的方法可能不對。
通常, Parallel.ForEach()
非常擅長優化線程數。 它考慮了系統中的核心數量,但也考慮了線程正在做什么(CPU綁定,IO綁定,方法運行的時間等)。
您可以控制最大並行度,但是沒有強制使用更多線程的機制。
確保您的基准測試是正確的,並且可以以公平的方式進行比較(例如,相同的網站,在開始測量之前允許預熱期,並且由於響應時間差異可能非常高,因此可以進行多次運行)。 如果仔細測量后您自己的線程代碼仍然更快,您可以得出結論,您已經針對特定情況優化了.NET並且堅持使用自己的代碼。
您可以在Parallel.ForEach中使用MaxDegreeOfParallelism屬性來控制將生成的線程數。
下面是代碼片段 -
ParallelOptions opt = new ParallelOptions();
opt.MaxDegreeOfParallelism = 5;
Parallel.ForEach(Directory.GetDirectories(Constants.RootFolder), opt, MyMethod);
很難說沒有看你的代碼以及如何定義集合,我發現Parallel.Invoke
是最靈活的。 試試msdn ? ...聽起來你正在尋找使用Parallel.For Method (Int32, Int32, Action<Int32, ParallelLoopState>)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.