有个大学编程专业的学妹问我:我这个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写后台侧边栏模板,我笑了笑,然后给了她本秘籍。