1

我写了一个程序,它产生一个用户选择的线程数,每个线程都在互联网上爬行以搜索一些数据,你可以称之为网络爬虫。

程序的瓶颈绝对应该是网络容量,因为任何给定的线程都会花费大部分时间等待网络请求:

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

我遇到的问题是,如果我让它产生大约 20 个线程,该程序将达到它的峰值速度(就它已处理的网页数量而言),该速度约为每分钟 1,000 页。比这更多的线程和它的速度与我添加的线程数呈负相关。

另一方面,如果我启动 10 甚至 20 个单独的程序实例并在每个实例中生成 20 个线程,则程序的所有实例将达到相同的最高速度,从而导致每分钟 1000 的累积速度 * 运行的程序实例数.

我在stackoverflow上读到:

进程和线程都是独立的执行序列。典型的区别是(同一进程的)线程在共享内存空间中运行,而进程在不同的内存空间中运行。

所以我认为问题出在共享内存空间的大小上,但是我该如何改变它,以便我可以让一个实例运行与我的网络容量一样多的线程呢?

如果问题不是共享内存空间,那么限制因素/瓶颈是什么,我该如何解决?

提前感谢您的任何帮助或建议:)。

4

1 回答 1

2

默认情况下,所有WebClient实例(在同一个 AppDomain 中)仅限于活动的 2 个连接。System.Net.ServicePointManager.DefaultConnectionLimit您可以通过设置属性以编程方式更改此设置。这也可以使用 app.config 进行配置。此问题显示了更改限制的几个选项。只要确保 web api 不会因为发出太多请求而阻止您!

于 2013-07-02T15:18:30.530 回答