Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该在Python中使用线程还是多处理进行暴力强制?_Python_Multithreading_Multiprocessing - Fatal编程技术网

我应该在Python中使用线程还是多处理进行暴力强制?

我应该在Python中使用线程还是多处理进行暴力强制?,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,前几天,我写了一篇短文;基于TJ O'Connor的书:暴力Python——黑客、法医分析师、渗透测试人员和安全工程师的食谱 现在,作者使用了线程技术,但Reddit告诉我,使用多处理技术更适合暴力强迫。这是真的吗?如果是,为什么,如何在此实例中实现多处理 是否也可以将线程或多处理绑定到GPU而不是CPU?考虑到这不会阻塞CPU,也不会利用GPU的潜力来完成缩短破解时间和每分钟尝试次数的工作,当使用暴力强制时,这将更加高效和有效 我的代码如下(因为作者也使用了线程,所以我使用了线程) 总之,对于

前几天,我写了一篇短文;基于TJ O'Connor的书:暴力Python——黑客、法医分析师、渗透测试人员和安全工程师的食谱

现在,作者使用了线程技术,但Reddit告诉我,使用多处理技术更适合暴力强迫。这是真的吗?如果是,为什么,如何在此实例中实现多处理

是否也可以将线程或多处理绑定到GPU而不是CPU?考虑到这不会阻塞CPU,也不会利用GPU的潜力来完成缩短破解时间和每分钟尝试次数的工作,当使用暴力强制时,这将更加高效和有效

我的代码如下(因为作者也使用了线程,所以我使用了线程)


总之,对于暴力强制,线程是更好还是多处理更好?是否可以将其中一个绑定到GPU而不是CPU?

我不知道如何将任务绑定到GPU而不是CPU。但是对于其他查询
threading
vs
multiprocessing
,您100%希望使用
multiprocessing

强制执行是CPU绑定的任务,因为python有一个称为全局解释器锁的东西,它只允许一个CPU绑定的线程运行一次,所以应用程序将无法使用可能产生的多个线程

然而,多处理并非如此,因为它一次启动多个python解释器实例,您可以有效地将一个大任务分解为一堆小任务,让每个python解释器实例运行该任务,然后再将这些结果组合起来

您可以通过运行一些CPU基准测试任务来尝试并测试这一点,您将看到线程与顺序执行相比没有任何区别,在多核系统中,线程甚至可能会恶化性能

但是,通过多处理,您将清楚地看到差异

我有意不提供任何关于GIL的参考链接,因为有数百篇关于这个主题的文章,您很可能会阅读其中的多篇,以了解它是如何工作的,以及它的好处和影响是什么


虽然你可以看看大卫·比兹利和拉里·黑斯廷斯关于这个话题的Pycon演讲,他们对这个话题有很好的见解

任务经理怎么说?这段代码会导致100%的CPU使用率吗?可能是+@Torxed的重复我读过那篇文章,但由于这是一个“专门”任务,我想我会问它。我不确定在Python中,暴力强制是否需要线程或多处理,一些(许多)操作将锁定GIL,因此实际上只使用一个CPU核心。其他人不会。
extract\u-zip
是否完全不可能确定,因为您没有显示
extract\u-zip
。如果是这样的话,多线程将不会使它运行得更快。@ThomasWeller当我在aa zip上运行大型字典攻击时,我看到我的内存峰值从20%左右增加到80%(16 GB RAM)。CPU保持在<50%。@Arszilla:虽然关于CPU使用率的公认答案是可以的,但要注意,这可能涉及大量内存。zip文件不再只读取一次,而是可以读取数百万次。您的电脑可能正忙于从磁盘读取文件。接下来,这可能会使用所有RAM并开始交换,即它甚至会写入磁盘。最终,这可能比线程化慢得多。性能优化是一个怪兽。当CPU%达到100%时,限制进程的数量是一个好主意。那么什么是最佳的方法呢?因为字典或密码列表可能有几千行到近一百万行(德语字典有近一百万个单词)。这意味着它将读取.zip超过一百万次,对吗?这意味着它最终将写入磁盘并执行不需要的操作(不确定写入磁盘会做什么)。我的答案只是关注在CPU受限的任务(如暴力强制)情况下应该使用什么,您永远不会希望在生成的每个进程或线程中读取文件。通常,您应该只读取一次文件,然后以逻辑要求的任何方式对其进行操作。此外,由于每个进程都有自己的独立内存,因此涉及多线程的解决方案总是比多线程占用更多内存。但也有内存优化技术,如果内存也是一个问题,试着考虑一下生成器。问题是我对线程/多线程/多处理的概念相当陌生。这也意味着我不知道如何进行内存优化。我只是想提高我的.zip饼干。从你的回答中,我知道我应该使用多重处理,将.zip“打开”一次,然后再继续?但是怎么做呢?有好的/简单的多处理指南吗?
import argparse
from threading import Thread
import zipfile

parser = argparse.ArgumentParser(description="Unzips a password protected .zip by performing a brute-force attack using either a word list, password list or a dictionary.", usage="BruteZIP.py -z zip.zip -f file.txt")
parser.add_argument("-z", "--zip", metavar="", required=True, help="Location and the name of the .zip file.")  # Creates -z arg
parser.add_argument("-f", "--file", metavar="", required=True, help="Location and the name of the word list/password list/dictionary.")  # Creates -f arg
args = parser.parse_args()


def extract_zip(zip_file, password):
    try:
        zip_file.extractall(pwd=password)
        print("[+] Password for the .zip: {0}".format(password.decode("utf-8")) + "\n")
    except:
        pass  # If a password fails, it moves to the next password without notifying the user. If all passwords fail, it will print nothing in the command prompt.


def main(zip, file):
    if (zip == None) | (file == None):
        print(parser.usage)  # If the args are not used, it displays how to use them to the user.
        exit(0)
    zip_file = zipfile.ZipFile(zip)
    txt_file = open(file, "rb")  # Opens the word list/password list/dictionary in "read binary" mode.
    for line in txt_file:
        password = line.strip()
        t = Thread(target=extract_zip, args=(zip_file, password))
        t.start()


if __name__ == '__main__':
    main(args.zip, args.file)  # BruteZIP.py -z zip.zip -f file.txt.