2011-02-22 79 views
3

我有幾千個項目。對於每個項目,我需要下載一個網頁並處理這個網頁。處理本身不是處理器密集型的。最有效的方式來下載數以千計的網頁

現在,我正在使用webclient類同步執行它,但它需要很長時間。我確定它可以很容易地被平行/不同步。但Iam正在尋找最有效的資源節約方式。對於活動web請求的數量可能有一些限制,所以我不喜歡創建數千個web客戶端並在每個web客戶端啓動異步操作的想法。除非它不是一個實際的問題。

是否可以在C#4中使用並行擴展和任務類?

編輯:感謝您的答案。我希望使用異步操作,因爲在paralel中運行同步操作只會阻止這些線程。

回答

1

您想使用稱爲生產者/消費者隊列的結構。你排隊所有的URL進行處理,並分配消費者線程去出隊每個URL(通過適當的鎖定),然後下載並處理它。

這使您可以控制和調整消費者的數量,以便在您的情況下最好地發揮作用。在大多數情況下,您會發現網絡運行的最佳吞吐量是通過5到20個活動連接實現的。更多,你開始擔心線程中的擁塞問題或線程間的上下文切換問題。當然,這取決於你的具體情況:具有大量內核和胖管道的服務器可能能夠將這個數字推得高得多,但撥號上的老P4可能會發現它最適合每次只需要一對。這就是調諧能力如此重要的原因。使用Parallel.ForEach

1

嘗試([項目列表],X => YourDownloadFunction(X))

它會自動和有效地處理併發性,使用線程池和一大堆。

1

使用線程。 Parallel.ForEach具有有限的線程,根據您擁有的核心/ CPU數量。提取網站並不會使整個操作過程中的線程完全活動。請求之間會有延遲(圖片,靜態內容等)。所以,使用線程來最大化速度。從50個線程開始,然後從那裏上去,看看你的電腦可以處理多少。

相關問題