【发布时间】:2010-12-01 05:15:58
【问题描述】:
我正在运行一个多线程的 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 个线程时,我们的明显开销 发送数据并检索 响应流平均值约为 第二。
- 当我们运行超过 4 个线程时, 平均值随最大值上升 遇到几十秒!
今天我能够运行两个独立的进程,每个进程运行 4 个线程(但基本上确保每个线程仍在运行唯一数据)。这一次,我们的整体吞吐量几乎翻了一番,每个流程的稳定时间约为一秒。
这让我相信我们在与 WebRequest 类相关的资源上遇到了某种限制;但这是每个进程的限制,而不是机器限制。我知道我们可以使用 BeginGetRequestStream 和 BeginGetResponse 异步进行调用,但我怀疑如果我们实际上达到某种资源限制,它是否会产生积极影响?!
我应该注意什么才能使我们在单个进程中增加拆分数量而不降低性能?
【问题讨论】:
标签: c# multithreading httpwebrequest