2015-03-17 13 views
6

Nota: I "forayed" nella terra di multiprocessing 2 giorni fa. Quindi la mia comprensione è molto semplice.Multiprocessing: più processi di cpu.count

Sto scrivendo e applicazione per caricamenti su bucket amazon s3. Nel caso in cui la dimensione del file sia maggiore (100mb), Ive ha implementato caricamenti paralleli utilizzando pool dal modulo multiprocessing. Sto usando una macchina con core i7, ho avuto un cpu_count di 8. Avevo l'impressione che se io facessi pool = Pool(process = 6) Io uso i core 6 e il file inizia a caricarsi in parti e gli upload per le prime 6 parti iniziano simultaneamente. Per vedere cosa succede quando lo process è maggiore dello cpu_count, ho inserito 20 (implicando che voglio usare 20 core). Con mia sorpresa invece di ottenere un blocco di errori, il programma ha iniziato a caricare 20 parti contemporaneamente (ho usato uno chunk size più piccolo per assicurarmi che ci siano un sacco di parti). Non capisco questo comportamento. Ho solo core 8, quindi come può il programma accettare un input di 20? Quando dico process=6, utilizza effettivamente 6 thread ?? Quale può essere l'unica spiegazione del fatto che 20 è un input valido poiché ci possono essere migliaia di thread. Qualcuno può spiegarmelo per favore.

Edit:

ho 'preso in prestito' il codice da here. L'ho modificato solo leggermente, in cui chiedo all'utente un utilizzo di base per la sua scelta invece di impostare parallel_processes su 4

+1

Si mescolano discussioni, processi e core. Sono tutte "cose" molto diverse. se si imposta 'processes = 6', verranno utilizzati solo 6 ** processi **, che possono essere eseguiti su un core, oppure possono essere eseguiti tutti su un core, a seconda del sistema operativo e del carico del sistema. Per quanto riguarda la "domanda", si prega di fornire un codice. –

risposta

7

Il numero di processi in esecuzione contemporaneamente sul computer non è limitato dal numero di core. In effetti probabilmente hai centinaia di programmi in esecuzione sul tuo computer, ognuno con un proprio processo. Per farlo funzionare, il sistema operativo assegna uno dei tuoi 8 processori a ogni processo o thread solo temporaneamente - a un certo punto potrebbe fermarsi e un altro processo prenderà il suo posto. Vedi What is the difference between concurrent programming and parallel programming? se vuoi saperne di più.

Modifica: l'assegnazione di più processi nell'esempio di caricamento può avere o meno senso. La lettura dal disco e l'invio sulla rete è normalmente un'operazione di blocco in python. Un processo che attende che il suo pezzo di dati da leggere o inviare possa essere fermato in modo che un altro processo possa iniziare il suo IO. D'altro canto, con troppi processi l'I/O di file o l'I/O di rete diventerà un collo di bottiglia e il programma rallenterà a causa del sovraccarico aggiuntivo necessario per il cambio di processo.

+0

quando si carica un file di oltre 1 Gb', il tempo impiegato diminuisce da '~ 10 minuti' (quando si usano i caricamenti seriali) a' 6 minuti' (quando uso caricamenti paralleli) – letsc

Problemi correlati