簡體   English   中英

在python腳本中增加吞吐量

[英]Increasing throughput in a python script

我正在通過挖掘處理DNSBL中成千上萬個域名的列表,創建URL和IP的CSV。 這是一個非常耗時的過程,可能需要幾個小時。 我的服務器的DNSBL每15分鍾更新一次。 有什么辦法可以增加Python腳本的吞吐量來跟上服務器的更新?

編輯 :腳本,根據要求。

import re
import subprocess as sp

text = open("domainslist", 'r')
text = text.read()
text = re.split("\n+", text)

file = open('final.csv', 'w')

for element in text:
        try:
            ip = sp.Popen(["dig", "+short", url], stdout = sp.PIPE)
            ip = re.split("\n+", ip.stdout.read())
            file.write(url + "," + ip[0] + "\n")
        except:
            pass

這里的絕大部分時間都花在了外部調用dig ,因此要提高速度,您需要使用多線程。 這將允許您同時運行多個調用以進行dig 例如,請參見: 從線程Python Python Subprocess.Popen 或者,您可以使用Twisted( http://twistedmatrix.com/trac/ )。

編輯:您是對的,其中大部分是不必要的。

好吧,可能是名稱解析讓您花了很長時間。 如果您將其排除在外(即,如果以某種方式快速返回的話),Python應該能夠輕松處理數千個條目。

也就是說,您應該嘗試使用線程方法。 從理論上講,這將同時解析多個地址,而不是順序解析。 您也可以繼續使用dig,為此修改下面的示例代碼應該很簡單,但是為了使事情變得有趣(並希望是更多的pythonic),讓我們使用一個現有的模塊: dnspython

因此,使用以下命令進行安裝:

sudo pip install -f http://www.dnspython.org/kits/1.8.0/ dnspython

然后嘗試以下操作:

import threading
from dns import resolver

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:
            result = resolver.query(self.address)[0].to_text()
            self.result_dict[self.address] = result
        except resolver.NXDOMAIN:
            pass


def main():
    infile = open("domainlist", "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()

如果證明同時啟動了太多線程,則可以嘗試分批執行或使用隊列(例如,請參閱http://www.ibm.com/developerworks/aix/library/au-threadingpython/) 。 )

我會考慮使用純Python庫來進行DNS查詢,而不是委托dig ,因為調用另一個進程可能會比較耗時。 (當然,在互聯網上查找任何內容也是相對耗時的,因此gilesc關於多線程的說法仍然適用)Google搜索python dns將為您提供一些入門選擇。

為了跟上服務器更新的步伐,執行時間必須少於15分鍾。 您的腳本運行需要15分鍾嗎? 如果不需要15分鍾,就可以完成!

我將研究以前運行的緩存和差異,以提高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM