2012-05-22 34 views
1

我寫了一個爬蟲程序,它使用用戶加載的單詞列表在網站上執行多個搜索並解析每個生成的頁面。如何在異步多線程爬蟲中鎖定回調類?

爲了達到這個目的,我編寫了一個循環遍歷單詞列表的主要方法,異步地發送多個http get請求(使用ThreadPool.QueueUserWorkItem)獲取當前單詞的所有結果頁面,直到找不到更多結果爲止,然後轉到下一個單詞。

回調函數使用靜態方法訪問公共靜態類,該靜態方法解析返回的html並相應地執行操作。現在,我把它鎖在類的類型,每次的東西訪問方法:

static class Parser 
{ 
    public static string ResponseAsString(HttpWebResponse response) 
    { 
     lock (typeof(Parser)) 
     { 
      try 
      { 
       Stream stream; 
       if (response == null || (stream = response.GetResponseStream()) == null) return string.Empty; 
       using (var sr = new StreamReader(stream)) 
        return sr.ReadToEnd(); 
      } 
      catch { return string.Empty; } 
     } 
    } 

    public static void CallbackMethod_ParseData(string html) 
    { 
     lock (typeof(Parser)) 
     { 
      //Do some work here 
     } 
    } 
} 

如此下來,我的問題:我如何才能更有效地鎖定類,並通知正在等待的線程鎖被釋放時,或我不應該讓Parser成爲一個靜態類,而是讓每個ThreadPool線程實例化它自己的這個類的實例嗎?

非常感謝您的幫助,

-still學習

+0

對不起我在這裏新...並且我不能upvote任何人因爲我沒有足夠的代表 – blizz

+0

好吧,我現在感覺像一個混蛋哈哈。對不起,我忘記了最低點要求upvote。 :( –

回答

1

的鎖是沒有必要的。只要靜態方法不共享靜態數據,靜態方法就是線程安全的,根據您的示例,靜態方法不是。

1

看着你的代碼,我不認爲有任何理由有鎖。

+0

)如果我在CallbackMethod_ParseData中調用另一個包含List對象的靜態類(Globals),那麼該方法稱爲「Globals.AddToList」並使用lock(ListObj)。如何提高效率在所有情況下, – blizz

+0

我不相信你可以,聽起來就像在這種情況下你實際上訪問的是一個共享資源,所以在這種情況下鎖是必要的,我不會擔心效率和處理線程一樣多正常。 –