fork multiprocessing () vs spawn ()
Stavo leggendo la descrizione dei due dal documento python :
produrre
Il processo genitore avvia un nuovo processo interprete Python. Il processo figlio erediterà solo le risorse necessarie per eseguire il metodo run () degli oggetti del processo. In particolare, i descrittori di file e gli handle non necessari dal processo padre non verranno ereditati. L'avvio di un processo utilizzando questo metodo è piuttosto lento rispetto all'utilizzo di fork o forkserver. [Disponibile su Unix e Windows. L'impostazione predefinita su Windows e macOS.]
forchetta
Il processo genitore utilizza os.fork () per eseguire il fork dell'interprete Python. Il processo figlio, quando inizia, è effettivamente identico al processo genitore. Tutte le risorse del genitore vengono ereditate dal processo figlio. Notare che il fork sicuro di un processo multithread è problematico. [Disponibile solo su Unix. L'impostazione predefinita su Unix.]
E la mia domanda è:
- è che il fork è molto più veloce perché non cerca di identificare quali risorse copiare?
- è che, poiché fork duplica tutto, "sprecherebbe" molte più risorse rispetto a spawn ()?
Risposte
- è che il fork è molto più veloce perché non cerca di identificare quali risorse copiare?
Sì, è molto più veloce. Il kernel può clonare l'intero processo e copia solo le pagine di memoria modificate nel loro insieme . Il collegamento delle risorse a un nuovo processo e l'avvio dell'interprete da zero non sono necessari.
- è che, poiché fork duplica tutto, "sprecherebbe" molte più risorse rispetto a spawn ()?
Il fork sui kernel moderni fa solo "copia su scrittura" e interessa solo le pagine di memoria che cambiano effettivamente. L'avvertenza è che "scrivere" comprende già la semplice iterazione su un oggetto in CPython. Questo perché il conteggio dei riferimenti per l'oggetto viene incrementato.
Se hai processi a lunga esecuzione con molti piccoli oggetti in uso, questo può significare che sprechi più memoria che con spawn. Aneddoticamente ricordo che Facebook affermava di avere ridotto notevolmente l'utilizzo della memoria passando da "fork" a "spawn" per i loro processi Python.