c# - 多线程网络爬虫线程数限制

标签 c# multithreading

我可以访问一个用 .NET C# 编写的应用程序,该应用程序连接(主要使用“原始”http 请求,部分使用 Web 服务和 xml 请求,仍然通过 http)到许多外部系统并更新其中的一些内容。

在给定时间可能有很多工作在排队,增加吞吐量的简单方法是增加线程数。其背后的逻辑是:由于大部分时间我们都在等待网络回复,我们可以同时等待更多的网络回复。 cpu 和 ram 似乎没有达到极限。

仍然创建大约 300 个线程会使一切运行速度低于线程数较低的情况。

我想知道这是操作系统限制(Windows Server 2012 r2)、.NET (4.5) 限制还是其他?我如何诊断瓶颈在哪里? (正如我所说,cpu 和 ram 似乎不是问题所在)

我知道外部系统可能会过载并降低整体性能,但我们假设这可以忽略不计。

最佳答案

创建一个线程需要一些 CPU 和 RAM,300 个线程创建每个线程至少分配 1 MB 加上堆栈分配和一些其他东西。

你应该为此使用线程池。池中的线程已经创建并等待为您服务。

如果长时间等待网络响应,您可以使用 asynchronous IO不需要很多线程的算法。

关于c# - 多线程网络爬虫线程数限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26212155/

相关文章:

c# - MEF 最佳实践 : Where in the application I create container and where to call Compose()?

c# - 部署后配置文件中缺少 <configSections>

c# - 将 List<T> 转换为嵌套 Dictionary<string, Dictionary<string, T>

c# - 使用任务返回值时出现 InvalidCastException

c# - 回发后将数据保留在 GridView 中

c# - Itextsharp HTMLWorker.Parse 错误

python - 为什么将 list() 包裹在 map 周围会导致函数运行?

java - 如何确保所有线程在主线程结束之前结束?

c++ - 使STL对象线程安全的标准方法?

multithreading - 我的 cocoa 应用程序记录了一些 "[Switching to process XXXX thread 0xXXXX]"