【发布时间】:2017-09-12 09:10:16
【问题描述】:
我想使用多线程 Web 请求,但我没有获得预期的性能。
我正在使用具有 4 核、1 Gbps 上传和 1 Gbps 下载的计算机运行。
为了测试,我正在下载谷歌主页。
来自 google 页面的数据大小约为 50 KB。
我同时发送 1000 个请求,除了在 ~2 秒内完成所有请求之外,我需要 20 多秒才能完成
我的代码如下所示:
bool success = ThreadPool.SetMinThreads(workerThreads: 2000, completionPortThreads: 1000);
success = ThreadPool.SetMaxThreads(2000, 2000);
DateTime dt = DateTime.UtcNow;
Parallel.For(0, 1000, (num) =>
{
string url = "https://www.google.co.il/?gfe_rd=cr&dcr=0&ei=OZy3WcmoMY7b8Affj4F4&gws_rd=ssl";
using (WebClient web = new WebClient())
{
byte[] bytes = web.DownloadData(url);
}
}
);
double sec = (DateTime.UtcNow - dt).TotalSeconds;
Console.WriteLine(sec);
【问题讨论】:
-
另外,请注意
Parallel.For每个核心仅使用一个线程(因此在您的情况下,四个线程)。这不是用于 I/O 绑定操作的正确工具 -
此外,ServicePintManager 默认限制您对任何主机的 2 个并发请求。您需要更改默认连接限制,或考虑将 connectionManagement 部分添加到您的 app.config 文件中。
标签: c# multithreading httpwebrequest webrequest