线程数和Web请求数之间的平衡

本文关键字:平衡 之间 Web 线程 请求 | 更新日期: 2023-09-27 18:27:00

我有一个执行多个线程的程序。每个线程只需执行一个HTTPWebRequest,然后屏幕抓取页面以查找一些文本。我正在与其他用户竞争寻找这篇文章。我可以执行1000000个线程,所有线程都在寻找相同的东西。

我的想法是,这会给我的处理器带来很多工作,实际上会导致请求执行速度变慢。如何在要执行的线程数量和web请求的性能之间找到平衡。基本上,我想做的是找到要派生的线程的最佳数量,这样它们就可以获得最大的数据量。

该应用程序使用.NET4,并使用C#编写。

线程数和Web请求数之间的平衡

您认为1000000个线程会给您的CPU带来不适当的压力,这是正确的。您的CPU必须做的工作来管理和在这么多线程之间切换,这可能会导致您的系统速度非常慢。

显然,您对1000000个线程并不认真,但它表明您不能简单地向问题抛出更多线程。你并不真的想编写自己的负载均衡器——这并不容易,也不会像基类库附带的类那样执行良好。看看ThreadPool线程的使用情况,CLR会为您管理它们。您还可以查看.NET 4.0中新增的并行任务库(因为您提到了您正在使用的)。

ALso查看这篇关于多线程的伟大文章:

http://www.albahari.com/threading/

C#有一个线程池。将您的web抓取任务提交到池中。你可以调整池中的线程数量来调整你的应用程序——你可能需要将其增加到远高于默认值的水平,才能在你这样的要求下获得最佳性能。

正如@M Babcock发布的那样,大量的线程是浪费的。

我不确定C#线程池中的线程数量是否可以在运行时更改,(我看不出为什么不可以,但m$…)。如果在运行过程中可以调整,调整会更容易!

您需要使用Parallel.Foreach来正确管理线程。。。

您提出的是性能问题,而没有提供任何对实际需求的估计。。。所以让我试着为你做。

假设网络和普通网卡很棒,你能提取多少数据——最高100Mb/s,可能低于10Mb/s。这大约每秒提供不到10000个请求(假设约为10K个请求/响应对)。

一个线程能处理那么多数据吗?即使对于单个线程来说,每秒搜索100Mb也应该不是问题。超级易于原型/测量。

我需要多少线程来读取数据——可能是1——启动异步请求很快,在队列中读取响应或发布响应以进行处理很快,每秒10000项。

所以我估计,如果你有更多的核心并愿意并行运行处理,那么简单代码需要1个线程(每个核心1+1个线程)。