multiproceso de Python
Basado en documentos oficiales:
/3/library/multiprocessing.html
Japan Tesco, acabo de ver un blog, la redacción no es del todo correcta. Es más seguro basarlo en el oficial
Sólo me gusta copiar el oficial, jaja
Generalmente usamos Process para crear una instancia de un proceso y llamamos a su método start() para empezarlo.
Este método es el mismo que Thread.
En la imagen de arriba, escribí p.join(), por lo que el proceso principal espera a que el proceso secundario termine de ejecutarse antes de ejecutar print("Run End")
De lo contrario, es al revés (Esto no es necesariamente cierto. Depende de su declaración. En realidad, el orden es aleatorio). Por ejemplo:
Agregue un sueño al proceso principal
Arriba usamos os.getpid() y os.getppid() para obtener el proceso actual y el ID del proceso principal
Lo siguiente es Hablemos sobre el uso de estas dos funciones:
os.getpid()
Devuelve la identificación del proceso actual
os.getppid( )
Devuelve la identificación del proceso padre. Después de que sale el proceso principal, Unix regresa a uno de los procesos de inicialización (1)
Windows devuelve el mismo ID (puede ser utilizado por otros procesos)
Esto también explica por qué ejecuté El programa anterior varias veces y el parentid impreso por primera vez fue 14212.
El id del proceso padre del proceso hijo es el id del proceso que lo llamó: 1940
Notas del vídeo:
Multiproceso: utilice el general método:
Referencia: Comunicación del proceso (tubería y cola)
pool.map (la función puede tener retorno o *compartir memoria o cola) El resultado es directamente una lista
poll.apply_async() (Igual que map, pero es un proceso, el resultado devuelto se obtiene con xx.get())
Error:
Referencia: /3/ biblioteca/itertools .html#itertool-functions
Hay un problema. Es mejor no usar todas las CPU para múltiples procesos, porque esto puede afectar otras tareas, así que agregue el parámetro de proceso al grupo de procesos. para especificar el número de CPU:
Lo anterior es reservar una CPU para hacer otras cosas
Más tarde, al usar Queue directamente, encontré este problema:
Solución:
Manager() .Queue() reemplaza a Queue()
Debido a que queue.get() está bloqueando, se puede juzgar de antemano si está vacío para evitar el bloqueo. el proceso. Por ejemplo, de la siguiente manera:
Utilice queue.empty() y establezca vacío en Verdadero