1

我編寫了一個程序,它產生一個用戶選擇的線程數量,每個線程都在搜索某些數據時抓取互聯網,您可以將其稱爲webcrawler。如何允許多線程進程使用盡可能多的資源作爲多個進程

程序的瓶頸絕對應該是網絡能力,因爲任何給定的線程花費其大部分的時間等待網絡請求:

WebClient client = new WebClient(); 
string url = "http://averynice.web.api?x=2d2d2&?y=dwdwdw"; 
string response = client.DownloadString(url) 

我遇到的問題是,該方案將達到它的峯值速度(就其處理的網頁數而言),如果我生成大約20個線程,速度大約是每分鐘1000頁。除此之外的任何更多的線程,它的速度都與我添加的線程數量呈負相關。另一方面,如果我啓動10個甚至20個獨立的程序實例並在每個實例中產生20個線程,程序的所有實例都將達到相同的最高速度,從而導致累積速度爲每分鐘1000個*號碼的程序實例正在運行。

我閱讀這裏#1是:

兩個進程和線程是執行的獨立的序列。典型的區別在於線程(同一進程)在共享內存空間中運行,而進程在不同的內存空間中運行。

所以我想這個問題是在共享內存空間的大小,但我要如何改變這種狀況,這樣我可以有運行儘可能多線程我的網絡容量將處理一個實例?

如果問題不是共享內存空間,那麼什麼是限制因素/瓶頸,我該如何解決它?

在此先感謝您的任何幫助或建議:)。

+1

有兩個同時連接的默認限制。這個問題的答案描述瞭如何改變它:http://stackoverflow.com/q/866350/517852 –

+0

提到的共享內存空間實際上是在其線程之間共享的進程虛擬地址空間。它的大小在32位Windows版本上爲2 GiB(如果特殊的3/1調整選項有效,則爲3 GiB),而在64位系統上則多得多。 –

+0

@mikez這絕對是美麗的。請提交一個我的問題的答案,我將不接受當前的一個贊成你的解決我的問題,只需一行代碼! –

回答

2

默認情況下,所有WebClient實例(在同一AppDomain中)僅限於活動2連接。您可以通過設置System.Net.ServicePointManager.DefaultConnectionLimit屬性以編程方式進行更改。這也可以使用app.config進行配置。這question顯示了更改限制的幾個選項。只要確保Web API不會阻止您提出太多請求!

+0

非常感謝,我的程序現在全速運行,一個進程運行大約300個線程,此時cpu在達到80%的負載時變成瓶頸。這或網絡容量,很難說,但不重要。 –