我目前正在尝试使用Python zipfile密码破解程序,它是多线程的。我认为一个新的线程就像一个新的连接/实例,基本上可以更快地完成工作,只有当我删除线程并计时差异时我才会对性能的明显下降感到震惊(x6更慢)。我会在这里插入代码,以防出现问题。
import zipfile
from threading import Thread
def extractFile(zFile, password):
try:
zFile.extractall(pwd=password)
print '[+] Password:', password
except:
pass
def main():
zFile = zipfile.ZipFile('encrypted.zip')
passFile = open('dictionary.txt', 'r')
for line in passFile.readlines():
password = line.strip('\n')
t = Thread(target=extractFile, args=(zFile,password))
t.start()
if __name__ == '__main__':
main()
一旦我删除线程,它就会快6倍。时间结果是:
real 18m46.974s
user 18m25.936s
sys 9m6.872s
real 3m32.674s
user 3m6.400s
sys 0m25.664s
为什么会这样?我希望使用多线程方法可以提高性能。
答案 0 :(得分:2)
这种方法存在两个问题:
1)你正在产生N个线程,其中N是dictionary.txt中的行数。根据我猜测在dictionary.txt中存在的行数,这意味着您将在紧密循环中产生数千个线程。让许多线程同时运行是一个巨大的资源消耗,因为每个线程占用一些内存,而你的CPU实际上一次只能运行几个线程(实际上,在Python中它一次只能运行一个线程,更多的是在#2)。实际产生一个线程还有一个成本,产生很多线程会降低你的速度。
2)由于GIL,在Python中一次只能有一个线程实际执行。这抵消了多核CPU的好处,它应该允许您一次处理多个线程。您应该使用multiprocessing模块(特别是Pool类)进行并行化。它将允许您利用多个内核,并且使用池将阻止您生成数千个进程并使系统停止运行。