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%的负载时变成瓶颈。这或网络容量,很难说,但不重要。 –