2011-05-12 16 views
11
from multiprocessing import Process 
# c is a container 
p = Process(target = f, args = (c,)) 
p.start() 

Asumo una copia profunda de c se pasa a funcionar porque f copia superficial no tendría sentido en el caso de un nuevo proceso (el nuevo proceso no tiene acceso a los datos del proceso de llamada).argumentos de multiprocesamiento de python: ¿copia profunda?

Pero, ¿cómo se define esta copia profunda? Hay un total de set of notes en la documentación copy.deepcopy(), ¿se aplican todas estas notas aquí también? La documentación de multiprocessing no dice nada ...

Respuesta

9

Cuando crea una instancia de Process, Python emite un fork(). Esto crea un proceso hijo cuyo espacio de memoria es una copia exacta de su elemento primario, por lo que todo lo que existe en el momento de la horquilla se copia.

En Linux esto se hace eficiente a través de "copy-on-write". Desde el fork man page:

tenedor() crea un proceso hijo que difiere del proceso padre solamente en su PID y PPID, y en el hecho de que los utilizaciones de recursos se ponen a 0. cerraduras de archivos y pendientes las señales no son heredadas

Bajo Linux, tenedor() se implementa el uso de páginas de copia en escritura, por lo que la única pena de que se incurre es el tiempo y de memoria necesarios para duplicar las tablas de páginas del de los padres, y para crear un único estructura de tareas para el niño.

+0

+1. Tenga en cuenta que Windows usa un mecanismo diferente que 'fork()', pero los efectos son similares. –

+0

Esto es correcto, pero hay que mencionar que no es cierto que no se copie nada. El recolector de basura de Python necesita mantener conteos de ref. Sin embargo, la sobrecarga de memoria para esto es insignificante (creo que 4kb por cada proceso). –

Cuestiones relacionadas