¿Por qué se recomienda utilizar multiproceso en lugar de multiproceso en Python?
En subprocesos múltiples de Python, el método de ejecución de cada subproceso:
1. Obtener GIL
2. Ejecute el código hasta que esté en suspensión o en la máquina virtual de Python. se colgará.
3. Liberar el GIL
Se puede ver que si un hilo quiere ejecutarse, primero debe obtener el GIL. Podemos considerar el GIL como un "pase" y en. En un proceso de Python, solo hay un GIL. Los subprocesos que no pueden obtener un pase no pueden ingresar a la CPU para su ejecución.
En Python2.x, la lógica de lanzamiento de GIL es que el subproceso actual encuentra una operación IO o el recuento de ticks llega a 100 (los ticks pueden considerarse como un contador del propio Python, utilizado específicamente para GIL. Después cada lanzamiento se restablece a cero, este recuento se puede ajustar a través de
sys.setcheckinterval) y liberarse.
Cada vez que se libera el bloqueo GIL, los subprocesos compiten por los bloqueos y cambian de subproceso, lo que consume recursos. Y debido al bloqueo de GIL, un proceso en Python solo puede ejecutar un subproceso al mismo tiempo (el subproceso que obtuvo el GIL puede ejecutarse. Es por eso que la eficiencia de subprocesos múltiples de Python no es alta en CPU de múltiples núcleos).
Entonces, ¿el subproceso múltiple de Python es completamente inútil?
Aquí tenemos una discusión clasificada:
1. Código con uso intensivo de CPU (procesamiento de varios bucles, conteo, etc.) ticks El recuento pronto alcanzará el umbral y luego desencadenará el lanzamiento y la nueva competencia de GIL (el cambio entre múltiples subprocesos ciertamente consume recursos), por lo que los subprocesos múltiples en Python no son compatibles con el código con uso intensivo de CPU.
2. Para códigos con uso intensivo de IO (procesamiento de archivos, rastreadores web, etc.), el subproceso múltiple puede mejorar de manera efectiva la eficiencia (si hay operaciones de IO en un solo subproceso, se producirá una espera de IO, lo que provocará operaciones innecesarias). pérdida de tiempo y apertura de varios subprocesos pueden cambiar automáticamente al subproceso B mientras el subproceso A está esperando, de modo que no se desperdicien recursos de la CPU y mejore así la eficiencia de ejecución del programa). Por lo tanto, el subproceso múltiple de Python es más amigable para el código con uso intensivo de IO.
En python3. Resuelve el problema causado por GIL de que solo se puede ejecutar un hilo al mismo tiempo, por lo que la eficiencia aún es insatisfactoria.
Tenga en cuenta: los subprocesos múltiples de múltiples núcleos son peores que los subprocesos múltiples de un solo núcleo. La razón es que con los subprocesos múltiples bajo un solo núcleo, cada vez que se libera el GIL, el subproceso activado puede. obtenga el bloqueo GIL, para que pueda ejecutarse sin problemas, pero en sistemas multinúcleo, después de que CPU0 libere el GIL, los subprocesos de otras CPU competirán, pero la CPU0 puede obtener el GIL inmediatamente, lo que provocará que los subprocesos se despierten en varias otras CPU. estar despierto y esperar hasta el momento de cambiar. Ingresar al estado de espera, lo que provocará una alteración del hilo y una menor eficiencia.
Volviendo a la pregunta original: a menudo escuchamos a los veteranos decir: "Si desea aprovecharlo al máximo. de CPU multinúcleo en Python, simplemente use múltiples procesos", ¿cuál es el motivo?
La razón es: cada proceso tiene su propio GIL independiente y no interfiere entre sí, por lo que se puede ejecutar en paralelo en un verdadero sentido. Por lo tanto, en Python, la eficiencia de ejecución de múltiples. El proceso es mejor que el de subprocesos múltiples (solo para CPU de múltiples núcleos).
Así que aquí está la conclusión: en multinúcleo, si desea realizar un procesamiento paralelo para mejorar la eficiencia, un método más común es utilizar múltiples procesos, lo que puede mejorar efectivamente la eficiencia de la ejecución.