多线程WebRequest调用和争用

时间:2009-09-24 19:38:06

标签: c# multithreading httpwebrequest

我正在运行一个多线程的C#控制台应用程序。核心流程检索要处理的一些数据,将其拆分为可配置数量的较小数据集,然后生成相同数量的线程来处理每个数据子集。

要处理单个记录,线程必须使用WebRequest类和POST方法调用Web服务。查询与GetRequestStream()一起发送,并使用GetResponse()检索响应。

在伪代码中,例程看起来像这样:

prepare WebRequest data;
* get time (start-of-Processing);
Stream str = request.GetRequestStream();
Write data to stream;
stream.Close();
WebResponse resp = request.GetResponse();
* get time (response-received);
process response;
finally close response stream;

时序数据表明,当我们将数据拆分为4个以上的线程时,整个流程的吞吐量不会提高,有时甚至会下降。来自网络服务的计时数据保持其性能保持不变。

  • 在4个线程中,我们的明显开销 发送数据并检索 响应流平均值围绕a 第二
  • 当我们运行4个以上的线程时, 平均值随最大值上升 遇到了几十秒!

今天我能够运行两个独立的进程,每个进程运行4个线程(但基本上确保每个线程仍然在唯一数据上运行)。这次,我们的整体吞吐量几乎翻了一番,每个流程都有大约一秒的稳定时间。

这让我相信我们对WebRequest类的资源有某种限制;但它是每个进程的限制,而不是机器限制。我知道我们可以使用BeginGetRequestStream和BeginGetResponse异步调用我们的调用,但我怀疑如果我们实际上遇到某种资源限制会产生积极的影响吗?!

我应该注意什么才能让我们在不降低性能的情况下提高单个流程中的拆分数量?

2 个答案:

答案 0 :(得分:13)

您需要增加可以对单个主机发出的同时Web请求的数量 - 否则您的线程基本上将等待彼此完成,尽管有足够的CPU可用。最简单的方法是使用<connectionManagement>的{​​{1}}元素:

app.config

答案 1 :(得分:0)

您运行此计算机的计算机有多少处理器/核心?

当您计划的线程数多于系统中的核心数时,调度程序必须对每个线程进行时间分片并将其安排在可用核心上运行。因此,除非你的过程中存在死时间,否则性能不会增加并且实际上可能会下降 - 这就是你所描述的。