parte la facilità di utilizzo del modulo multiprocessing
quando si tratta di collegare processi con risorse di comunicazione, esistono altre differenze tra la deposizione delle uova più processi che utilizzano multiprocessing
rispetto all'utilizzo subprocess
per lanciare separato VM Python?pitone processo multiprocessing vs. Python standalone VM
risposta
Su piattaforme Posix, le primitive multiprocessing
essenzialmente avvolgono un os.fork()
. Ciò significa che al punto in cui si genera un processo in multiprocessing, il codice già importato/inizializzato rimane così nel processo figlio.
Questo può essere un vantaggio se si devono inizializzare molte cose e quindi ciascun sottoprocesso esegue essenzialmente operazioni su (copie di) quegli oggetti inizializzati, ma non tutto ciò che è utile se la cosa che si esegue nel sottoprocesso è completamente indipendente .
Ci sono anche implicazioni per risorse come handle di file, socket, ecc. Con multiprocessing
su una piattaforma unix-like.
Nel frattempo, quando si utilizza subprocess
, si sta creando un programma/interprete completamente nuovo ogni volta che si esegue Popen
un nuovo processo. Ciò significa che può esserci meno memoria condivisa tra di loro, ma significa anche che puoi Popen in un programma completamente separato o un nuovo punto di accesso nello stesso programma.
Su Windows, le differenze sono inferiori a multiprocessing
e subprocess
, perché Windows non fornisce fork()
.
Se si ignorano eventuali problemi di comunicazione (ad esempio, se le VM Python separate non comunicano tra loro o comunicano solo tramite altri meccanismi stabiliti in modo esplicito), non vi sono altre differenze sostanziali. (Credo che in certe condizioni multiprocessing
- le piattaforme tipo Unix - possano usare il più efficiente fork
invece della coppia fork-exec sempre implicita da multiprocessing
- ma non è "sostanziale" quando solo alcuni processi sono coinvolto [[IOW, la differenza di prestazioni all'avvio non sarà rilevante per le prestazioni dell'intero sistema]]).
Grazie ancora Alex! – jldupont
buoni punti ... grazie! – jldupont
Microsoft fornisce 'fork()' nelle versioni di fascia alta di Windows. Vedi la mia [risposta] (http://stackoverflow.com/a/5372260/95735) per i dettagli. –
@PiotrDobrogost Ma non credo che il "multiprocessing" di Windows ne approfitti. – Crast