2010-06-26 47 views
1

我正在編寫一個python腳本來讀取域列表,找出Mcafee的Siteadvisor服務提供的評級,然後將域和結果輸出到CSV。我該如何解決這個多線程的Python腳本?

我已經將我的腳本關閉了this previous answer。它使用urllib來抓取有問題域名的Siteadvisor頁面(不是最好的方法,我知道,但Siteadvisor沒有提供其他選擇)。不幸的是,它沒有生產任何東西 - 我一直得到這個錯誤:

Traceback (most recent call last): 
    File "multi.py", line 55, in <module> 
    main() 
    File "multi.py", line 44, in main 
    resolver_thread.start() 
    File "/usr/lib/python2.6/threading.py", line 474, in start 
    _start_new_thread(self.__bootstrap,()) 
thread.error: can't start new thread 

這裏是我的腳本:

import threading 
import urllib 

class Resolver(threading.Thread): 
    def __init__(self, address, result_dict): 
     threading.Thread.__init__(self) 
     self.address = address 
     self.result_dict = result_dict 

    def run(self): 
     try: 
      content = urllib.urlopen("http://www.siteadvisor.com/sites/" + self.address).read(12000) 
      search1 = content.find("didn't find any significant problems.") 
      search2 = content.find('yellow') 
      search3 = content.find('web reputation analysis found potential security') 
      search4 = content.find("don't have the results yet.") 

      if search1 != -1: 
       result = "safe" 
      elif search2 != -1: 
       result = "caution" 
      elif search3 != -1: 
       result = "warning" 
      elif search4 != -1: 
       result = "unknown" 
      else: 
       result = "" 

      self.result_dict[self.address] = result 

     except: 
      pass 


def main(): 
    infile = open("domainslist", "r") 
    intext = infile.readlines() 
    threads = [] 
    results = {} 
    for address in [address.strip() for address in intext if address.strip()]: 
     resolver_thread = Resolver(address, results) 
     threads.append(resolver_thread) 
     resolver_thread.start() 

    for thread in threads: 
     thread.join() 

    outfile = open('final.csv', 'w') 
    outfile.write("\n".join("%s,%s" % (address, ip) for address, ip in results.iteritems())) 
    outfile.close() 

if __name__ == '__main__': 
    main() 

任何幫助將不勝感激。

+0

嘗試調試它。 – 2010-06-26 00:24:03

+1

您創建了多少個線程? – 2010-06-26 00:24:54

回答

1

它看起來像你試圖啓動太多的線程。

您可以檢查[address.strip() for address in intext if address.strip()]列表中有多少項。我認爲這是一個問題。基本上可用資源有限,可以啓動新線程。

解決方法是將你的列表分塊爲20個元素,做20個線程中的東西,等待線程完成他們的工作,然後拿起下一個塊。執行此操作,直到處理完列表中的所有元素。

您還可以使用一些線程池來更好地管理線程。 (我最近使用this implementation)。

+0

聽起來像個好主意。謝謝 – Tom 2010-06-26 00:53:21

+0

很高興我能幫助你 – dzida 2010-06-26 17:10:13

1

您可以創建的線程數可能有一個上限,並且您可能超過了它。建議:創建一個小的固定數量的Resolvers - 在10以下可能會使您獲得可能的並行性優勢的90% - 以及來自python隊列庫的(線程安全)隊列。讓主線程將所有域轉儲到隊列中,並讓每個Resolver一次從隊列中取一個域並對其進行處理。