Python中的多线程MD5校验和

时间:2012-04-12 19:58:52

标签: python multithreading md5 checksum

我有一个python脚本,递归地遍历指定的目录,并校验它找到的每个文件。然后它会写一个日志文件,列出所有文件路径及其md5校验和。

顺序地,这需要很长时间才能获得50,000个文件,每个文件15 MB。但是,我的计算机拥有的资源比实际使用的资源多得多。如何调整我的方法以便脚本使用更多资源来更快地执行?

例如,我可以将文件列表拆分为三分之一并为每个文件运行一个线程,为我提供3倍的运行时间吗?

我对线程不太满意,我希望有人不介意为我的案例鞭打和示例。

这是我的顺序md5循环的代码:

for (root, dirs, files) in os.walk(root_path):
    for filename in files:
        file_path = root + "/" + filename
        md5_pairs.append([file_path, md5file(file_path, 128)])

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:5)

对于这种工作,我认为多处理.Pool会给你更少的惊喜 - 查看http://docs.python.org/library/multiprocessing.html

上的示例和文档

答案 1 :(得分:0)

如果您要使用线程,则需要首先启动线程并让它们在Queue.Queue实例上进行轮询。然后在你的主线程中,运行你拥有的for循环,但不是调用md5file(..),而是推送Queue.Queue上的所有参数。 Threading / Queue in Python有一个示例,但也请查看文档:{​​{3}}

答案 2 :(得分:0)

GIL(全局解释器锁定)对线程没有多大帮助。你的应用程序永远不会同时执行多次调用md5.update函数。我会继续尝试优化改进您的流程池。

答案 3 :(得分:0)

尴尬地并行并为一大块文件启动一个进程。我们在集群上这样做。你可以拥有数十个或数百个进程,每个进程只有几十个文件。此时,磁盘IO将成为您的瓶颈。