有个大学编程专业的学妹问我:我这个zip文件密码破解运行起来为什么内存爆了?

Posted yunyun云芸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有个大学编程专业的学妹问我:我这个zip文件密码破解运行起来为什么内存爆了?相关的知识,希望对你有一定的参考价值。

1.这篇博文的由来

在这里插入图片描述
在这里插入图片描述

2.跑下错误代码,找病根

先把学妹发给我的错误代码放上,能发现他为了提高速度加了多线程的代码,很聪明哦:

import zipfile
import itertools
from concurrent.futures import ThreadPoolExecutor
  
def extract(file, password):
    if not flag: return
    file.extractall(path='.', pwd=''.join(password).encode('utf-8'))
  
  
def result(f):
    exception = f.exception()
    if not exception:
        print('密码为:', f.pwd)
        global flag
        flag = False
  
  
if __name__ == '__main__':
    flag = True
    pool = ThreadPoolExecutor(100)
    nums = [str(i) for i in range(10)]
    chrs = [chr(i) for i in range(65, 91)]
    password_lst = itertools.permutations(nums + chrs, 6)
    zfile = zipfile.ZipFile("加密文件.zip", 'r')
    for pwd in password_lst:
        if not flag: break
        f = pool.submit(extract, zfile, pwd)
        f.pwd = pwd
        f.pool = pool
        f.add_done_callback(result)

用他的代码跑一下,乖乖隆地咚~跑一会儿内存就爆了。

那么原因是因为:ThreadPoolExecutor默认使用的是无界队列,尝试密码的速度跟不上生产密码的速度,会把生产任务无限添加到队列中,导致内存被占满。

展示下,内存直接飙到95:
在这里插入图片描述

然后导致程序崩溃:

在这里插入图片描述

3.找到病根,对症下药

修改下源码,发现ThreadPoolExecutor内部使用的是无界队列,所以导致内存直接飙满,重写ThreadPoolExecutor类中的_work_queue属性,将无界队列改成有界队列,这样就不会出现内存爆满的问题,看代码:

import queue
from concurrent.futures import ThreadPoolExecutor
  
  
class BoundedThreadPoolExecutor(ThreadPoolExecutor):
    def __init__(self, max_workers=None, thread_name_prefix=''):
        super().__init__(max_workers, thread_name_prefix)
        self._work_queue = queue.Queue(self._max_workers * 2) # 设置队列大小

最后学妹按我给他的建议,完美的破解密码成功

点击领取💌💌干货满满

①兼职交流,行业咨询、大佬在线专业解答有
②Python开发环境安装教程有
③Python400集自学视频有
④软件开发常用词汇有
⑤Python学习路线图有
⑥3000多本Python电子书有
如果你用得到的话可以直接拿走,在我的QQ技术交流群里群号: 675240729(纯技术交流和资源共享,广告勿入)以自助拿走

文章到这里结束啦,感谢观看,更多Python精彩内容可以关注小编看小编主页,或点击上面的领取干货满满。

以上是关于有个大学编程专业的学妹问我:我这个zip文件密码破解运行起来为什么内存爆了?的主要内容,如果未能解决你的问题,请参考以下文章

❤️大数据专业的学妹问我大数据怎么入门,我总结了亲身体验的学习路线推荐给她推荐收藏❤️

❤️大数据专业的学妹问我大数据怎么入门,我总结了亲身体验的学习路线推荐给她推荐收藏❤️

❤有学妹问我Java架构师怎么入门,我甩出12k亲身体验的学习视频推荐给她

学妹问我如何使用laravel写后台侧边栏模板,我笑了笑,然后给了她本秘籍。

学妹问我如何使用laravel写后台侧边栏模板,我笑了笑,然后给了她本秘籍。

学妹问我如何使用laravel写后台侧边栏模板,我笑了笑,然后给了她本秘籍。