2017-09-12 34 views
0

我想使用多线程的Web请求,但我没有得到我期望的性能。多线程的Web请求性能问题

我使用4核心的计算机运行,上载速度为1 Gbps,下载速度为1 Gbps。

对于我正在下载谷歌主页的测试。

从谷歌网页的数据大小是〜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); 
+2

https://stackoverflow.com/questions/1361771/max-number-of-concurrent-httpwebrequests –

+0

另外,注意'Parallel.For'将只使用一个每个核心线程(所以在你的情况下,四个线程)。这不是用于I/O绑定操作的正确工具 –

+0

另外,默认情况下,ServicePiontManager将任何主机的并发请求限制为2个。您需要更改默认的连接限制,或者查看向您的app.config文件添加connectionManagement部分。 –

回答

0

我觉得在你的情况下,更好的选择是使用HttpClient进行显式异步操作,并让Windows管理线程池本身。

Stopwatch sw = new Stopwatch(); 
sw.Start(); 

for (int i = 0; i < 1000; i++) 
{ 
    var httpClient = new HttpClient(); 
    results[i] = httpClient.GetByteArrayAsync(@"https://www.google.co.il/?gfe_rd=cr&dcr=0&ei=OZy3WcmoMY7b8Affj4F4&gws_rd=ssl"); 
} 

var status = Task.WhenAll(results); //WhenAny if you can process results independently 
var pages = status.Result; 
sw.Stop(); 
double sec = sw.Elapsed.TotalSeconds; 
Console.WriteLine(sec); 

边注:请考虑使用Stopwatchtime measurement

-1

的解决方案是:

 System.Net.ServicePointManager.DefaultConnectionLimit = int.MaxValue; 
+4

这个答案很混乱,缺乏上下文。你应该添加一些描述 –