Un modo semplice per raccogliere uscita dal sottoprocessi md5sum parallelo è quello di utilizzare un pool di thread e scrivere il file dal processo principale:
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)
- l'uscita dal
md5sum
è piccolo in modo da può memorizzarlo nella memoria
imap
conserva l'ordine
number_of_processes
potrebbe essere diverso dal numero di file o CPU core (valori maggiori non significa più veloce: dipende dalle prestazioni relative di IO (dischi) e CPU)
È possibile provare a passare più file contemporaneamente ai sottoprocessi md5sum.
In questo caso non è necessario il sottoprocesso esterno; 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()
utilizzare più processi invece di fili (per consentire il puro Python md5sum()
correre in parallelo utilizzando più CPU) solo cadere .dummy
dall'importazione nel codice precedente.
Grazie. Tuttavia, ho 1000 di md5sum. Preferirei non aprire un file separato per ciascuno. – imagineerThat
No, non dovresti. Crea un file 'Queue.Queue' e un pool di thread di alcune dozzine di thread, lascia che ogni thread legga un elemento dalla coda e avvii un sottoprocesso per questo elemento, attendi il completamento di questo sottoprocesso, ottieni il risultato (il checksum md5) , memorizza il risultato in una mappatura. Se la coda è vuota, i thread dovrebbero terminare. – Alfe
Nuovo in Python ancora. Devo usare Queue.Queue per scrivere su un mapping contemporaneamente? In caso contrario, cosa fa Queue.Queue per me? – imagineerThat