Python Threaded Vs Non Threaded

时间:2014-05-05 19:31:21

标签: python multithreading

我目前正在尝试使用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

为什么会这样?我希望使用多线程方法可以提高性能。

1 个答案:

答案 0 :(得分:2)

这种方法存在两个问题:

1)你正在产生N个线程,其中N是dictionary.txt中的行数。根据我猜测在dictionary.txt中存在的行数,这意味着您将在紧密循环中产生数千个线程。让许多线程同时运行是一个巨大的资源消耗,因为每个线程占用一些内存,而你的CPU实际上一次只能运行几个线程(实际上,在Python中它一次只能运行一个线程,更多的是在#2)。实际产生一个线程还有一个成本,产生很多线程会降低你的速度。

2)由于GIL,在Python中一次只能有一个线程实际执行。这抵消了多核CPU的好处,它应该允许您一次处理多个线程。您应该使用multiprocessing模块(特别是Pool类)进行并行化。它将允许您利用多个内核,并且使用池将阻止您生成数千个进程并使系统停止运行。