"¿Los procesos secundarios generados a través del multiprocesamiento comparten objetos creados anteriormente en el programa?"
No (python antes de 3.8) y Sí en 3.8 ( https://docs.python.org/3/library/multiprocessing.shared_memory.html#module-multiprocessing.shared_memory )
Los procesos tienen espacio de memoria independiente.
Solución 1
Para aprovechar al máximo una estructura grande con muchos trabajadores, haga esto.
Escriba cada trabajador como un "filtro": lee los resultados intermedios de stdin, funciona, escribe resultados intermedios en stdout.
Conecte a todos los trabajadores como una tubería:
process1 <source | process2 | process3 | ... | processn >result
Cada proceso lee, trabaja y escribe.
Esto es notablemente eficiente ya que todos los procesos se ejecutan al mismo tiempo. Las escrituras y lecturas pasan directamente a través de búferes compartidos entre los procesos.
Solucion 2
En algunos casos, tiene una estructura más compleja, a menudo una estructura "en abanico". En este caso, tiene un padre con varios hijos.
El padre abre los datos de origen. El padre bifurca a varios hijos.
El padre lee la fuente, distribuye partes de la fuente a cada hijo que se ejecuta simultáneamente.
Cuando el padre llegue al final, cierre la tubería. El niño termina el archivo y termina normalmente.
Las partes secundarias son agradables de escribir porque cada niño simplemente lee sys.stdin
.
El padre tiene un poco de juego de pies elegante para engendrar a todos los hijos y retener las tuberías correctamente, pero no es tan malo.
Fan-in es la estructura opuesta. Varios procesos que se ejecutan de forma independiente deben intercalar sus entradas en un proceso común. El recopilador no es tan fácil de escribir, ya que tiene que leer de muchas fuentes.
La lectura de muchas canalizaciones con nombre a menudo se realiza utilizando el select
módulo para ver qué canalizaciones tienen entradas pendientes.
Solución 3
La búsqueda compartida es la definición de una base de datos.
Solución 3A: cargue una base de datos. Deje que los trabajadores procesen los datos en la base de datos.
Solución 3B: cree un servidor muy simple usando werkzeug (o similar) para proporcionar aplicaciones WSGI que respondan a HTTP GET para que los trabajadores puedan consultar el servidor.
Solución 4
Objeto de sistema de archivos compartido. Unix OS ofrece objetos de memoria compartida. Estos son solo archivos que se asignan a la memoria para que se realice el intercambio de E / S en lugar de más lecturas almacenadas en búfer por convención.
Puede hacer esto desde un contexto de Python de varias maneras
Escriba un programa de inicio que (1) rompa su objeto gigantesco original en objetos más pequeños y (2) inicie trabajadores, cada uno con un objeto más pequeño. Los objetos más pequeños podrían ser objetos de Python encurtidos para ahorrar un poco de tiempo de lectura de archivos.
Escriba un programa de inicio que (1) lea su objeto gigantesco original y escriba un archivo codificado por bytes con estructura de página utilizando seek
operaciones para garantizar que las secciones individuales sean fáciles de encontrar con búsquedas simples. Esto es lo que hace un motor de base de datos: dividir los datos en páginas, hacer que cada página sea fácil de localizar mediante un archivo seek
.
Genere trabajadores con acceso a este archivo de gran tamaño con estructura de página. Cada trabajador puede buscar las partes relevantes y hacer su trabajo allí.
marshal.load
a los padres y a cada hijo (cada proceso importa el módulo).