2012-05-24 75 views
1

我正在創建一個簡單的網絡蜘蛛。它所做的只是接受一個URL,下載HTML並提取剩餘的URL。然後它重複每個新URL的過程。我也確保我不會訪問同一個URL兩次,並限制了併發下載的數量。檢測線程樹完成時

在每一個唯一的URL已經耗盡(可以運行幾天,幾周或直到我死了和離開後)之後,我想要執行一個操作,比如更新UI或者簡單地退出應用程序。

問題是,我不知道如何檢測最後一個線程何時完成運行。

此線程問題是否已解決?我在看問題錯了嗎?

一個想法是保持每個線程活着,直到其所有的孩子完成(加入)。問題是線程的數量呈指數增長。對於這樣一個長期運行的過程,它會很快耗盡操作系統資源。

回答

2

我不確定我們在說什麼語言,所以我會說一般的。

您需要每個URL的數據結構,以跟蹤從中生成多少個「子」頁面。每當一個URL被蜘蛛攻擊時,它就會有一個「父」數據結構。無論何時找到新頁面,都會添加到父項的樹狀結構中。每當頁面出現蜘蛛時,父節點樹的數量就會減少。這將需要以同步的方式完成,因爲多個線程將更新它。

您可能實際上想要保存整個URL結構。根URL「http://foo.x/」具有「/1.html」和「/2.html」的鏈接,因此它的子項數爲2.根URL具有null父項,「1」和「 2「有一個根的父母。當「1.html」被蜘蛛攻擊時,根的子項計數遞減到1.但是如果「1.html」中有3個鏈接,則根的計數增加到4.如果你想跟蹤樹那麼「1.html」的孩子數就等於3等。然後,當「1.html」的孩子中有一個出現蜘蛛時,「1.html」的計數變爲2,根URL的計數變爲3。

你肯定不要圍繞保持線程,然後再加入你提到 - 你的線程數會爆炸。你應該使用一個線程池並提交URLs到蜘蛛池中,每一個都與URL樹中的關聯節點一起提交到池中,以便它們可以被相同的線程捕獲。

當一個URL被蜘蛛攻擊,並且孩子數量變爲0時,你知道你已經爬滿了整棵樹,並且URL可以從工作列表中移除並移動到完成列表。同樣,這些列表將需要同步,因爲多個線程將對它們進行操作。

希望這有些幫助。

+0

我從其他人那裏得到了類似的答案。在開始一個子線程之前簡單地遞增,然後遞減。當計數變爲零時,讓該子線程啓動「我已完成」的工作。謝謝! –