編寫可靠的多執行緒蜘蛛程式

2021-04-09 06:48:07 字數 1461 閱讀 9065

thursday, 24. august 2006, 05:52:14技術

〔此篇專為qq群[17371752]「搜尋引擎.資料.蜘蛛」中的朋友做主題研討之用〕

1. 蜘蛛程式長啥樣?

蜘蛛程式的是搜尋引擎中最關鍵的後台程式之一,它必須十分可靠,可以長期執行而無需經常維護。但是我往往看到許多朋友開始做蜘蛛程式的時候總是將很多精力放到了介面上。個人覺得這是沒有必要的,我們應該注重這個程式的可靠性和效率。

(圖1. coolgobot,笑侃的第乙個蜘蛛程式)

(圖2. 有簡單介面的蜘蛛程式)

(圖3. webus系統中最有效的蜘蛛程式之一)

2. 蜘蛛程式的結構

(圖4. 蜘蛛程式結構)

2.1 用佇列來傳遞url資料

2.2 兩種多執行緒方案

對於蜘蛛程式而言有兩種多執行緒方案

a. 搶先式多執行緒

b. 迴圈式多執行緒

這兩種方案中,我比較傾向於b方案,因為採用這種方案將使得程式的結構更加清晰,功能模組劃分也更加合理。所以後面我所說的多執行緒都是指迴圈式的多執行緒方案。

2.3 將臨時頁面資料儲存為檔案

我們不妨將臨時頁面儲存為檔案,然後用乙個queue將要處理得檔名傳遞給分析執行緒,再由分析執行緒去處理對應的檔案。這種處理方式就比上面的一種好得多,系統的可靠性又大大加強了。

2.4 分析執行緒 or 分析程式?

其實將分析部分作為執行緒還是單獨的程式來實現在邏輯上是沒有什麼區別的。這兩種方法應該可是實現同樣的可靠性和效率。但是作為程式會比作為執行緒實現起來麻煩一些。

2.5 url消重

3. 我們要思考的問題

3.1 頭號問題:outofmemoryexception

如果沒有搞錯的話,記憶體溢位是蜘蛛程式會遇到的頭號問題。它的特點是:不定性、突發性、災難性。要解決這個問題,我們首先要改變自己的程式設計習慣。如果想要 自己的蜘蛛長命百歲,就要採取節制的記憶體策略,呵呵,記憶體就像脂肪,太多了終究是會導致疾病的。那為什麼這個問題會體現出不定性、突發性呢?這和 win32的記憶體機制有關,關於這部分,可以參看:

3.2 異常管理

微軟的大師說過:如果沒有好的異常管理策略,就乾脆不要嘗試去管理。但他並不是要我們對異常採取聽之任之的態度。至少我們應該捕獲可能發生的異常。如果你希望自己的蜘蛛任勞任怨,不會罷工,就好好檢查一下和以下名詞相關的程式**中是否已經做了完備的異常處理:

3.3 分布式

對於開發蜘蛛程式的人而言,首要關心的是「多執行緒」然後就是「分布式」了。分布式是乙個比較複雜的問題,需要分析具體的部署條件和業務需求,從而選擇一種合適的設計模式來實現分布式應用。

關於這部分,大家可以自己到找找,很多的。

講完了,大家多多提出自己的方案或者想法,共同提高蜘蛛程式開發水平!

編寫安全的多執行緒C 程式

1 monitor類 主要是靜態方法 monitor.enter obj 獲得加在物件obj上的鎖 monitor.exit obj 釋放鎖 上面兩句之間的 相當於lock obj monitor.tryenter obj 該方法立即返回,如果返回值為false,則接下來不需要monitor.exi...

編寫java多執行緒爬蟲程式

所謂爬蟲程式,就是模擬瀏覽器傳送http請求給web 這裡我們實現乙個這樣的爬蟲程式 列出segmentfault 中指定使用者所有文章及其閱讀人數的程式 基本思路是這樣的 1我們進入某使用者的文章列表頁 2獲得文章列表 3對文章逐個訪問 4獲取文章頁面的閱讀數 比如以我的主頁舉例 1 進入文章列表...

多執行緒 使用鎖編寫執行緒安全的程式

對上乙個例子的改進。1 競爭資源 public class student2 設定物件和獲取物件的執行緒 為了展示效果,我們使用了迴圈。public class setthread implements runnable override public void run else x public ...