尽可能快地并行处理webrequest项目列表

时间:2013-01-29 14:17:56

标签: c# asynchronous httpwebrequest task-parallel-library parallel-extensions

我有一批我想要获取的网址。该列表包含具有不同域名的URL(超过50.000),但所有域使用相同的负载平衡服务器ip。

对于每个网址,我想记录其结果代码,其获取持续时间以及内容的哈希及其重定向标头。

当前方法每秒大约10次提取,响应时间约为半秒。

如何更快地执行以下操作?

我目前有以下代码构造:

Parallel.ForEach(domainnames, ProcessItem);

ProcessItem基于以下内容:

static void Fetch2(Uri url)
{
    HttpWebResponse response;
    try
    {
        var request = (HttpWebRequest)WebRequest.Create(url);
        request.AllowAutoRedirect = false;
        response = (HttpWebResponse)request.GetResponse())
    }
    catch (WebException ex)
    {
        response = ex.Response as HttpWebResponse;
    }

    if (response == null) return;

    using (response)
    {
        // Process response.....
    }
}

我已应用以下配置:

<system.net>
    <connectionManagement>
        <add address="*" maxconnection="100" />
    </connectionManagement>
</system.net>

我尝试了以下内容:

  • 通过指定新的ParallelOptions {MaxDegreeOfParallelism = 25}来限制Parallel.ForEach,因为我认为我可能正在处理大量的Web请求,但即使降低它也不会导致性能提升。
  • asyncTask.WaitAll(Task[])一起使用,但这会导致很多错误,因为所有任务都会快速创建非常,但几乎所有任务都会导致连接错误。

有趣的观察是:

  • 我的网络连接并没有真正负载,所以没有拥挤
  • cpu,内存和IO也没有真正的干扰,但IO显示逢低。

0 个答案:

没有答案