前几天有看到生成密码本的文章,但是那个是单线程的,跑的有点慢所以就自己搞了个多线程保存数据的密码本小脚本。
import string
import time
import concurrent.futures
def generate_passwords(length):
# chars = string.ascii_lowercase + string.digits
chars = '0123456789'
passwords = []
for i in range(length):
if i == 0:
passwords = list(chars)
else:
new_passwords = []
for password in passwords:
for char in chars:
new_passwords.append(password + char)
passwords = new_passwords
return passwords
# 定义保存密码的函数
def save_passwords(passwords):
with open('./保存的密码/password_book.txt', 'a') as f:
for password in passwords:
f.write(password + '\n')
if __name__ == '__main__':
start_time = time.time()
# 定义线程池
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as pools:
# 定义密码长度
length = 8
# 线程队列
futures = []
# 生成所有长度为length的密码组合
passwords = generate_passwords(length)
# 将密码列表分成10份,每份交给一个线程处理
password_chunks = [passwords[i::10] for i in range(10)]
# 使用线程池并发执行保存密码的函数
for chunk in password_chunks:
futures.append(pools.submit(save_passwords, chunk))
# 判断线程池是否还有任务
if all(f.done() for f in futures):
print("线程池中没有任务了")
end_time = time.time()
print(end_time - start_time)
值得注意的是,在这个程序里面所有的密码数据都保存在passwords这个变量里面。
passwords
所以在生成位数长的密码时内存可能会爆掉。改进方法我想可以通过生成器来实现不过暂时没有这个需求
在修改的时候只需要修改chars这个变量和length就可以了。
chars = '0123456789'
# 定义密码长度
length = 8
运行结果:
文件高达900多M
运行时间:
运行时间90s可以接受。