从并行 md5sum 子进程收集输出的一种简单方法是使用线程池并从主进程写入文件:
from multiprocessing.dummy import Pool # use threads
from subprocess import check_output
def md5sum(filename):
try:
return check_output(["md5sum", filename]), None
except Exception as e:
return None, e
if __name__ == "__main__":
p = Pool(number_of_processes) # specify number of concurrent processes
with open("md5sums.txt", "wb") as logfile:
for output, error in p.imap(md5sum, filenames): # provide filenames
if error is None:
logfile.write(output)
- 的输出
md5sum
很小,因此您可以将其存储在内存中
imap
保持秩序
number_of_processes
可能与文件或 CPU 内核的数量不同(较大的值并不意味着更快:它取决于 IO(磁盘)和 CPU 的相对性能)
您可以尝试一次将多个文件传递给 md5sum 子进程。
在这种情况下,您不需要外部子流程;您可以在 Python 中计算 md5:
import hashlib
from functools import partial
def md5sum(filename, chunksize=2**15, bufsize=-1):
m = hashlib.md5()
with open(filename, 'rb', bufsize) as f:
for chunk in iter(partial(f.read, chunksize), b''):
m.update(chunk)
return m.hexdigest()
要使用多个进程而不是线程(以允许纯 Pythonmd5sum()
使用多个 CPU 并行运行),只需.dummy
从上述代码中的导入中删除。