2012-02-10 71 views
1

我正在构建一个高交易量的系统,它的核心有一个递归函数。c#什么是代码递归函数的有效方式

简而言之,我想创建一个蜘蛛,它将轮流提取网页链接中找到的网址,然后抓取每个网址并继续执行某些操作。在很短的循环周期内,负载可以呈指数级增长,所以我希望尽可能使这些代码尽可能精简和高效。

我应该使用线程吗?如果是的话(逻辑是什么样子)

我使用最新的asp.net c#和VS2010与.net4,并希望新的技术有一些简单的方法来做到这一点,并隐藏所有的复杂性下同时高效且超快地处理逻辑。

回答

1

.NET的任务并行库为您的问题提供了一个很好的解决方案。有关更多信息,请参见this MSDN Magazine article

TPL旨在完成并行执行,但为您处理线程。它还使得等待任务完成变得容易,并且在完成另一组任务时运行一个任务,等等。

就你而言,这意味着“父”会为文档中的每个链接启动一个任务,然后可以等待子任务完成(如有必要)。子任务可以递归地开始子任务等等。不用担心穿线。

2

您不应该为蜘蛛使用递归。你应该有一个任务解析一个页面,并执行你想要处理的页面。如果发现链接,应该将其添加到链接队列中(确保不要多次链接链接,否则最终会出现无限循环)。主处理器只是通过队列并处理链接。

+0

同意。但蜘蛛的结果是立即可见的。我没有重建谷歌的数据库,我可以让工作几个小时。这将是一个输入网址并在屏幕上显示使用结果。并且递归的深度将被控制并设置为一个像5这样的小数字(否则,相互链接的网络将不可避免地成为一个无限循环),您是否仍然会提出您的架构? – kacalapy 2012-02-10 19:25:04

+0

每个规则都有例外:)。如果你有一个确定的深度并且跟踪你已经访问的链接,递归可能没有问题,尽管我认为使用队列并不困难得多(尽管跟踪深度可能更难),并且会使你的代码更加灵活。另外,如果你有一个队列可以工作,那么处理线程就容易多了。 – Brian 2012-02-10 19:41:47