【发布时间】:2013-06-20 05:29:12
【问题描述】:
我编写了一个程序,它生成用户选择的线程数,每个线程都在互联网上爬行以搜索一些数据,您可以将其称为网络爬虫。
程序的瓶颈肯定是网络容量,因为任何给定线程都将大部分时间花在等待网络请求上:
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 上读到:
进程和线程都是独立的执行序列。这 典型的区别是(同一进程的)线程在一个 共享内存空间,而进程在不同的内存空间中运行。
所以我认为问题出在共享内存空间的大小上,但我该如何改变它,以便让一个实例运行与我的网络容量一样多的线程?
如果问题不是共享内存空间,那么限制因素/瓶颈是什么?我该如何解决?
提前感谢您的任何帮助或建议:)。
【问题讨论】:
-
默认限制为 2 个同时连接。这个问题的答案描述了如何改变它:stackoverflow.com/q/866350/517852
-
这里提到的共享内存空间实际上是它的线程之间共享的进程虚拟地址空间。它的大小在 32 位 Windows 版本上为 2 GiB(如果特殊的 3/1 调整选项有效,则为 3 GiB),在 64 位系统上更大。
-
@mikez 这绝对是美丽的。请提交我的问题的答案,我将不接受当前的问题,而支持您的问题,它通过一行代码解决了我的问题!
标签: c# multithreading process parallel-processing shared-memory