在python脚本中增加吞吐量

2024-05-19 14:13:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个从DNSBL到dig的数千个域名列表,创建一个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

Tags: textimportipre服务器脚本url编辑
3条回答

嗯,可能是名字的决定让你花了这么长时间。如果不计算这个数(即,如果dig返回得非常快),Python应该能够轻松地处理数千个条目。在

也就是说,你应该尝试一种线程方法。这将(理论上)同时解析多个地址,而不是按顺序。您还可以继续使用dig来实现这一点,修改下面的示例代码应该很简单,但是,为了让事情变得有趣(希望更像python),让我们使用一个现有的模块来实现这个目的:dnspython

因此,请安装:

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

然后尝试以下方法:

^{pr2}$

如果这证明同时启动了太多的线程,可以尝试分批执行,或者使用队列(参见http://www.ibm.com/developerworks/aix/library/au-threadingpython/示例)

这里的大部分时间都花在对dig的外部调用中,因此要提高该速度,您需要多线程。这将允许您同时对dig运行多个调用。请参见示例:Python Subprocess.Popen from a thread。或者,可以使用Twisted(http://twistedmatrix.com/trac/)。在

你没必要这么做。在

我会考虑使用纯Python库来执行DNS查询,而不是委托给dig,因为调用另一个进程可能相对耗时。(当然,在互联网上查找任何东西也相对耗时,因此gilesc所说的多线程仍然适用)谷歌搜索python dns将为您提供一些开始的选项。在

相关问题 更多 >