【问题标题】:How to allow for a multi-threaded process to use as much ressource as multiple processes如何允许多线程进程使用与多个进程一样多的资源
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 非常感谢,我的程序现在全速运行,单个进程运行大约 300 个线程,此时 cpu 在达到大约 80% 负载时成为瓶颈。那个或网络容量,很难说但并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 2021-05-31
  • 1970-01-01
相关资源
最近更新 更多