En primer lugar, el multiprocesamiento multi-proceso
multiprocesamiento es un paquete que utiliza una API similar al generador de módulo de soporte hilo. paquete que ofrece tanto concurrencia local y remoto Multi-procesamiento, evitar efectivamente el bloqueo global intérprete utilizando el proceso hijo en lugar de hilo. Por lo tanto, el módulo de multiprocesamiento permite al programador para tomar ventaja de múltiples procesadores en una máquina determinada. Se ejecuta en Unix y Windows.
importación multiprocesamiento importación tiempo def ejecutar (nombre): print ( " Hola% s " % nombre) time.sleep ( 2 ) si __name__ == " __main__ " : para i en rango (5 ): p = multiprocessing.Process (target = Ejecutar, args = ( " jehu " ,)) p.start ()
Cada proceso tiene un proceso padre, el aspecto siguiente ejemplo en el progreso de cada identificador de proceso y proceso padre Identificación:
de multiprocesamiento Importación Proceso de Importación OS DEF información (título): Imprimir (título) Imprimir ( ' Nombre del módulo: ' , __name__ ) Imprimir ( ' proceso padre: ' , os.getppid ()) # imprimir el proceso padre lo anterior Identificación del mencionado impresión ( " Proceso de lo anterior Identificación del mencionado : 'os.getpid ()) # imprimir el proceso actual de lo anterior mencionado ID de impresión ( " \ n el \ n- el " ) DEF f (nombre): info ( '\ 033 [31; 1mfunction f \ 033 [0m ' ) de impresión ( ' hola 'nombre) si __name__ == ' __main__ ' : info ( ' \ 033 [32; línea de proceso 1mmain \ 033 [0m ' ) p = Proceso ( target = f, args = ( ' Bob ' ,)) p.start () p.join ()
Los resultados:
principal línea de proceso Nombre del módulo: __main__ proceso padre: 7944 proceso id: 6744 función f nombre del módulo: __mp_main__ proceso padre: 6744 : Proceso de Identificación 10136 Bob hola
El proceso principal es el identificador de proceso de su proceso hijo del proceso padre Identificación
la comunicación entre procesos
Entre los diferentes procesos de la memoria no es compartida, con el fin de intercambiar datos entre dos procesos, puede utilizar los métodos siguientes:
colas
Utilizar casi como enhebrar en la cola
de multiprocesamiento Importación Proceso, Queue DEF F (Q): q.put ([ 42 es, Ninguna, ' Hola ' ]) # 3. proceso principal de cola para la transmisión de datos del niño IF la __name__ == ' __main__ ' : Q = Queue () # 1 para generar un proceso principal Queue instancia de proceso, la atención es diferente del hilo de cola P = proceso (target = F, args = (Q,)) # Queue 2. el proceso como el parámetro principal para el subproceso p.start () Imprimir (q.get ()) # Prints "[42 es, Ninguna, 'Hola']" #. 4. Quitar los principales datos de proceso desde el paso niño en la cola de lograr datos entre diferentes procesos transferencia p.join ()
Sabemos que los datos no puede ser compartida entre los diferentes procesos, espacio de memoria diferente, por eso puede Cola proceso hijo proceso primario para pasarlo?
De hecho, la lógica subyacente es que, cuando la cola de proceso maestro como un parámetro pasado al proceso hijo es en realidad clona una cola para el proceso hijo y el proceso hijo es el proceso principal tiene una cola, a su cola proceso hijo cuando los datos transmitidos, hay datos en la cola de un tercero mediante el depósito Pickl serialización identificador de proceso viene, a continuación, deserializar la cola de escritura en el proceso principal. Hay un tercero, en lugar de entre el proceso principal y sub-proceso de transferencia de datos directamente.
de multiprocesamiento Importación Proceso , Queue
DEF F (Q):
q.put ([ 42 es , Ninguna, 'Hola' ]) .. # 3 sub-proceso para el proceso principal de la cola en la transmisión de datos
SI la __name__ == '__main__' : Q = Queue () # 1 genera en un proceso en el proceso principal Queue ejemplo, la atención es diferente del hilo de cola P = proceso ( objetivo = F , args = (Q , )) # 2. el proceso principal de la cola como un parámetro para el subproceso p.start () Imprimir (q.get ())
# Prints "[42, ninguno, 'hola']" # 4. proceso principal de los de cola recuperación de datos pasan en el proceso de niño, para lograr una transferencia de datos entre los diferentes procesos
p.join ()