Ein einfacher Weg, Ausgabe von parallel md5sum Subprozesse zu sammeln ist ein Thread-Pool zu verwenden und aus dem Hauptprozess in die Datei schreiben:
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)
- die Ausgabe von
md5sum
klein ist, dass Sie so kann es im Speicher speichern
imap
Konserven Reihenfolge
number_of_processes
kann sich von der Anzahl der Dateien oder der CPU unterscheiden Kerne (größere Werte bedeutet nicht schneller: es hängt von der relativen Leistung von IO (Festplatten) und CPU)
Sie können versuchen, mehrere Dateien auf einmal zu den Unterprozessen md5sum übergeben.
In diesem Fall benötigen Sie keinen externen Subprozess; you can calculate md5 in Python:
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()
mehr Prozesse anstelle von Threads zu verwenden (md5sum()
dem reinen Python zu ermöglichen läuft parallel Verwendung mehrerer CPUs) in dem obigen Code nur Drop .dummy
aus dem Import.
Vielen Dank. Allerdings habe ich 1000 von md5sums. Ich würde lieber keine separate Datei für jeden öffnen. – imagineerThat
Nein, sollten Sie nicht. Erstellen Sie eine 'Queue.Queue' und einen Thread-Pool von einigen Dutzend Threads, lassen Sie jeden Thread ein Element aus der Warteschlange lesen und starten Sie einen Subprozess für dieses Element, warten Sie auf den Abschluss dieses Subprozesses, holen Sie sich das Ergebnis (die md5-Checksumme) , speichern Sie das Ergebnis in einem Mapping. Wenn die Warteschlange leer ist, sollten die Threads beendet werden. – Alfe
Neu bei Python noch. Muss ich Queue.Queue verwenden, um gleichzeitig in ein Mapping zu schreiben? Wenn nicht, was macht Queue.Queue für mich? – imagineerThat