¿Por qué se recomienda utilizar multiproceso en lugar de multiproceso en Python?
Necesitamos saber por qué, y más aún por qué. Por eso llevamos a cabo la siguiente investigación en profundidad:
En primer lugar, enfaticemos los antecedentes:
1.
El nombre completo de GIL es Global Interpreter Lock (Global Interpreter Lock), que surge de las consideraciones iniciales del diseño de Python y la decisión tomada para la seguridad de los datos.
2. Cada CPU solo puede ejecutar un subproceso al mismo tiempo (de hecho, el subproceso múltiple en una CPU de un solo núcleo es solo concurrencia, no paralelismo. La concurrencia y el paralelismo son conceptos macro del procesamiento de múltiples solicitudes). al mismo tiempo, pero existe una diferencia entre concurrencia y paralelismo. Paralelo significa que dos o más eventos ocurren al mismo tiempo. Concurrencia significa que dos o más eventos ocurren dentro del mismo intervalo de tiempo)
En Python multiproceso. A continuación, el modo de ejecución de cada hilo es:
1, obtenga GIL
2 Ejecute el código hasta que se suspenda o la máquina virtual Python.
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". En un proceso de Python, solo hay un GIL. Los subprocesos que no pueden pasar 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 en el propio Python, que se usa específicamente para GIL, y regresa después de cada lanzamiento) cero, este recuento se puede ajustar mediante sys.setcheckinterval).
Sin embargo, cada vez que se libera el bloqueo GIL, los subprocesos competirán por el bloqueo y cambiarán de subproceso, lo que consume recursos. Y debido a la existencia del bloqueo GIL, un proceso en Python solo puede ejecutar un subproceso al mismo tiempo (el subproceso que obtiene el GIL solo puede ejecutarse. Esta es también la razón por la cual la eficiencia de subprocesos múltiples de Python no es alta). CPU multinúcleo.
Entonces, ¿el subproceso múltiple de Python es completamente inútil?
Aquí analizamos la clasificación:
1. Código que requiere un uso intensivo de la CPU (procesamiento de varios bucles, conteo, etc.) Se alcanzará una gran cantidad de trabajo de cálculo y luego se activará el lanzamiento y la nueva competencia de GIL (por supuesto, alternar entre múltiples subprocesos requiere recursos), por lo que hay muchos en Python.