2010-02-16 4 views
10

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

13

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().

+0

buoni punti ... grazie! – jldupont

+1

Microsoft fornisce 'fork()' nelle versioni di fascia alta di Windows. Vedi la mia [risposta] (http://stackoverflow.com/a/5372260/95735) per i dettagli. –

+0

@PiotrDobrogost Ma non credo che il "multiprocessing" di Windows ne approfitti. – Crast

3

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]]).

+0

Grazie ancora Alex! – jldupont