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

时间:2012-03-05 18:31:41

标签: c# .net multithreading performance httpwebrequest

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

我的想法是,这会给我的处理器带来很多工作,实际上会导致请求执行得更慢。如何在要执行的线程数和Web请求的性能之间找到平衡点。基本上我想要做的是找到最佳的线程数,以便它们下拉的数据量最大。

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

4 个答案:

答案 0 :(得分:1)

你可以假设1000000个线程会给你的CPU带来不必要的压力。您的CPU必须做的工作来管理和切换多个线程可能会导致您的系统非常慢。

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

还可以查看这篇关于多线程的好文章:

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

答案 1 :(得分:1)

C#有一个ThreadPool。将您的网络抓取任务提交到池中。您可以调整池中的线程数来调整您的应用程序 - 您可能需要将其增加到远高于默认值以获得最佳性能,并满足您的要求。

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

我不确定C#ThreadPool中的线程数是否可以在运行时更改,(我没有理由不这样做,但M $ ...)。如果在运行期间可调整,调整将更加容易!

答案 2 :(得分:0)

您需要使用Parallel.Foreach正确管理您的主题...

答案 3 :(得分:0)

您正在询问效果问题,并未提供有关实际要求的任何估算......所以让我尝试为您做。

您可以吸收多少数据 - 假设网络和常规网卡很棒 - 最大100Mb / s,可能低于10Mb /秒。这给每秒少于10000个请求(假设~10K请求/响应对)。

一个线程可以处理那么多数据 - 即使对于单个线程,每秒搜索100Mb应该不是问题。超级简单的原型/测量。

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

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

相关问题