2013-10-03 44 views
0

我有下面的代碼中,我刮多個網站:的Python - 終止某些線程

while len(newData) > 0: 
    for i in newData: 
     try: 
      thread.start_new_thread(download, (i)) 
     except Exception, thread.error: 
      pass 

但我的問題是,它是在做重複刮每個網站每個幾次。在下載函數中,一旦下載完成,我將從newData中移除url,以便不再打開任何線程。一旦完成了某個任務,我該如何殺死所有嘗試執行特定任務的線程?這是我第一次嘗試線程,並不確定我是否以正確的方式執行此操作。

回答

0

首先你可能想看看http://scrapy.org/這是一個很棒的網頁抓取框架。

當你現在這樣做的時候,你需要編寫線程管理器,它將持有句柄給它們,用某種符號表示什麼是內部的(比如URL的校驗和),並且一旦完成某個校驗和用所述校驗和來殺死其他線程。

但請記住,只是殺掉這樣的線程並不是一個好主意,更好的解決方案是實現一個隊列,以確保您不會解析重複項並僅爲這些線創建線程。有一些nice examples of worker pooling and queues in the official manual所以看看。

1

而不是自己做,創建一個隊列。將對象放入包含啓動任務所需的全部數據的隊列中。創建一個等待隊列中元素的工作者池。讓他們把他們的結果放到另一個(輸出/結果)隊列中。

開始時,創建包含URL等的數據對象,並將它們全部放入隊列中。

然後你只需要等待結果進入輸出隊列。