我可以访问一个用 .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/