2012-02-10 69 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