我使用的是python 2.7,我有一个简单的多头md5字典:
# -*- coding: utf-8 -*-
import md5
import Queue
import threading
import traceback
md5_queue = Queue.Queue()
def Worker(queue):
while True:
try:
item = md5_queue.get_nowait()
except Queue.Empty:
break
try:
work(item)
except Exception:
traceback.print_exc()
queue.task_done()
def work(param):
with open('pwds', 'r') as f:
pwds = [x.strip() for x in f.readlines()]
for pwd in pwds:
if md5.new(pwd).hexdigest() == param:
print '%s:%s' % (pwd, md5.new(pwd).hexdigest())
def main():
global md5_queue
md5_lst = []
threads = 5
with open('md5', "r") as f:
md5_lst = [x.strip() for x in f.readlines()]
for m in md5_lst:
md5_queue.put(m) # add md5 hash to queue
for i in xrange(threads):
t = threading.Thread(target=Worker, args=(md5_queue,))
t.start()
md5_queue.join()
if __name__ == '__main__':
main()
在5个线程中工作。每个线程从队列中读取一个哈希值并使用密码列表进行检查。非常简单:1个线程1签入'for'循环。
我想要多一点:1个线程和几个线程来检查密码。所以work()应该从队列中读取哈希并启动一个新的线程来检查密码(1个线程哈希,10个线程检查密码)。例如:20个带有哈希的线程和20个线程,用于在每个线程中使用哈希值。这样的事情。
我该怎么做?
P.S。对不起我的解释,问你是否理解我想要的东西。
P.P.S。它不是关于brd md5,而是关于多线程。
感谢。
答案 0 :(得分:4)
Python的默认实现(称为CPython)使用Global Interpreter Lock(GIL),它实际上只允许一个线程一次运行。对于I / O绑定的多线程应用程序,这通常不是问题,但对于像你这样的CPU绑定应用程序,这意味着你不会看到多核加速。
我建议使用不具有GIL的不同Python实现,例如Jython,或者重写代码以使用不具有GIL的其他语言。在原生编译的代码中编写它是一个好主意,但是大多数具有MD5功能的脚本语言通常都会在本机代码中实现,所以老实说,我不会期望在本机编译语言和脚本语言之间加速很多。 / p>
答案 1 :(得分:1)
我认为以下代码比示例代码更有效:
from __future__ import with_statement
try:
import md5
digest = lambda text: md5.new(text).hexdigest()
except ImportError:
import hashlib
digest = lambda text: hashlib.md5(text.encode()).hexdigest()
def main():
passwords = load_passwords('pwds')
check_hashes('md5', passwords)
def load_passwords(filename):
passwords = {}
with open(filename) as file:
for word in (line.strip() for line in file):
passwords.setdefault(digest(word), []).append(word)
return passwords
def check_hashes(filename, passwords):
with open(filename) as file:
for code in (line.strip() for line in file):
for word in passwords.get(code, ()):
print (word + ':' + code)
if __name__ == '__main__':
main()
它已经用Python 2.x和3.x编写,并且应该能够在这两种语言中运行。