簡體   English   中英

最好地使用Parallel.ForEach / Multithreading

[英]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);

值得一試的是TPL Dataflow庫。

MSDN上的DataFlow

請參閱Parallel.ForEach中的嵌套等待

Parallel.ForEach()背后的整個想法是你有一組線程,每個線程都處理集合的一部分。 正如您所注意到的,這不適用於async-await,您希望在異步調用期間釋放該線程。

此外,演練創建數據流管道專門設置和處理多個網頁下載。 TPL Dataflow確實是為這種情況設計的。

很難說沒有看你的代碼以及如何定義集合,我發現Parallel.Invoke是最靈活的。 試試msdn ...聽起來你正在尋找使用Parallel.For Method (Int32, Int32, Action<Int32, ParallelLoopState>)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM