【发布时间】:2013-05-04 16:22:23
【问题描述】:
我有一个网络抓取工具,可以处理大约 2,000 个页面,我尝试使用 Parallel.ForEach 循环来加速这些页面。我当前的代码(为简洁起见)是:
Parallel.ForEach(dataTable1.AsEnumerable(), row =>
{
scrape();
}
);
public void scrape()
{
HtmlWeb htmlWeb = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = htmlWeb.Load("http://www.website.com");
doScraping(doc);
}
当它使用常规的foreach 循环时,它起作用了。现在,它将处理一些行,然后在尝试检索 HTMLDocument 时开始出现以下异常:
System.dll 中发生了“System.Net.WebException”类型的第一次机会异常
在 HtmlAgilityPack.dll 中发生了“System.Net.WebException”类型的第一次机会异常
操作超时
在并行循环中操作时发生超时的原因是什么?它将通过前 150-300 行,然后对于后续的每一行都会超时。
【问题讨论】:
-
听起来你想废弃的网站阻止了你,因为你并行执行大量请求,在他们看来这就像 DOS 攻击。
-
@shriek:我不认为该网站阻止了我。当我不断收到超时错误时,我可以从浏览器访问它。另外,如果我重新启动应用程序,它会暂时再次运行。
-
添加新的 ParallelOptions { MaxDegreeOfParallelism = 4 } 似乎可以将我的问题减少到非常偶然的超时。我在 4 核处理器上运行该应用程序。我仍然很好奇为什么并行不能更好地处理这个问题。
标签: c# html-agility-pack parallel.foreach