下载数千个网页的最有效方式

时间:2011-02-22 19:08:19

标签: c# c#-4.0 asynchronous webclient

我有几千件物品。对于每个项目,我需要下载网页并处理此网页。处理本身不是处理器密集型的。

现在,我正在使用webclient类同步,但这需要太长时间。我确信它可以很容易地进行平行/异步。但Iam正在寻找最具资源效率的方法。活动webrequests的数量可能有一些限制,所以我不想创建数千个webclients并在每个webclients上启动异步操作。除非它不是一个实际问题。

是否可以在C#4中使用Parallel Extensions和Task类?

修改:感谢您的回答。我希望使用异步操作,因为在paralel中运行同步操作只会阻塞这些线程。

3 个答案:

答案 0 :(得分:1)

您想要使用称为生产者/消费者队列的结构。您排队所有URL进行处理,并分配使用者线程以使每个URL出列(具有适当的锁定),然后下载并处理它。

这使您可以控制和调整最适合您情况的消费者数量。在大多数情况下,您会发现网络操作的最佳吞吐量是通过5到20个活动连接实现的。更多,你开始担心线程上的拥塞问题或线程之间的上下文切换问题。当然,它根据您的具体情况而有所不同:具有大量核心和胖管道的服务器可能能够将这个数字推得更高,但拨号上的旧P4可能会发现它最好只在一次只有几个。这就是调整能力如此重要的原因。

答案 1 :(得分:1)

尝试使用Parallel.ForEach([项目列表],x => YourDownloadFunction(x))

它将使用线程池和整个批次自动有效地处理并发。

答案 2 :(得分:1)

使用线程。 Parallel.ForEach具有有限的线程,基于您拥有的核心/ cpu的数量。在整个操作过程中,获取网站并不会使线程完全处于活动状态。请求(图像,静态内容等)之间会有延迟。因此,使用线程来最大化速度。从50个线程开始,然后从那里开始查看您的计算机可以处理多少。