fork multiprocesamiento () vs spawn ()

Sep 28 2020

Estaba leyendo la descripción de los dos del documento de Python :

Aparecer

El proceso padre inicia un nuevo proceso de intérprete de Python. El proceso hijo solo heredará los recursos necesarios para ejecutar el método run () de los objetos de proceso. En particular, no se heredarán descriptores de archivo y manejadores innecesarios del proceso principal. Iniciar un proceso con este método es bastante lento en comparación con el uso de fork o forkserver. [Disponible en Unix y Windows. El predeterminado en Windows y macOS.]

tenedor

El proceso padre usa os.fork () para bifurcar el intérprete de Python. El proceso hijo, cuando comienza, es efectivamente idéntico al proceso padre. Todos los recursos del padre son heredados por el proceso hijo. Tenga en cuenta que la bifurcación segura de un proceso multiproceso es problemática. [Disponible solo en Unix. El predeterminado en Unix.]

Y mi pregunta es:

  1. ¿Es que la bifurcación es mucho más rápida porque no intenta identificar qué recursos copiar?
  2. ¿Es que, dado que fork duplica todo, "desperdiciaría" muchos más recursos en comparación con spawn ()?

Respuestas

3 Darkonaut Sep 28 2020 at 12:25
  1. ¿Es que la bifurcación es mucho más rápida porque no intenta identificar qué recursos copiar?

Sí, es mucho más rápido. El kernel puede clonar todo el proceso y solo copia las páginas de memoria modificadas como un todo . No es necesario canalizar recursos a un nuevo proceso y arrancar el intérprete desde cero.

  1. ¿Es que, dado que fork duplica todo, "desperdiciaría" muchos más recursos en comparación con spawn ()?

La bifurcación en los núcleos modernos solo "copia al escribir" y solo afecta las páginas de memoria que realmente cambian. La advertencia es que "escribir" ya abarca simplemente iterar sobre un objeto en CPython. Eso es porque el recuento de referencias del objeto se incrementa.

Si tiene procesos de larga ejecución con muchos objetos pequeños en uso, esto puede significar que desperdicia más memoria que con spawn. Como anécdota, recuerdo que Facebook afirmó haber reducido considerablemente el uso de memoria al cambiar de "fork" a "spawn" para sus procesos de Python.