Python多线程比非多线程

2024-04-27 03:13:03 发布

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

我目前正在试验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倍。时间结果是:

螺纹

^{pr2}$

无螺纹

real    3m32.674s
user    3m6.400s
sys     0m25.664s

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


Tags: import密码maindeflinepassword性能线程
1条回答
网友
1楼 · 发布于 2024-04-27 03:13:03

这种方法有两个问题:

1)生成N个线程,其中N是字典.txt. 根据我猜有多少行字典.txt,这意味着您将在一个紧密的循环中生成数千个线程。同时运行这么多线程是一个巨大的资源消耗,因为每个线程都会占用一些内存,而您的CPU实际上一次只能运行几个线程(实际上,在Python中,一次只能运行一个线程,而在#2中更多)。实际上生成一个线程也是有成本的,而且生成的线程很多会减慢您的速度。

2)由于GIL,在Python中一次只能实际执行一个线程。这就否定了多核CPU的优点,它允许您一次处理多个线程。您应该使用multiprocessing模块,特别是Pool类来并行化。它将允许您利用多个核心,并且使用一个池将防止您产生数千个进程并使您的系统停止运行。

相关问题 更多 >