¿Por qué la velocidad no cambia después de usar el grupo de subprocesos de Python?
Subproceso único
En mi computadora con CPU de 4 núcleos, el tiempo necesario para un solo subproceso es de 6,5 segundos.
Subprocesos múltiples
Crea dos subprocesos t1 y t2. Cada subproceso realiza 50 millones de operaciones de resta. Una vez que ambos subprocesos han terminado de ejecutarse, el subproceso principal finaliza el programa. Como resultado, el tiempo de ejecución de dos subprocesos de forma cooperativa es de 6,8 segundos, lo que es más lento. Lógicamente hablando, si dos subprocesos se ejecutan en paralelo en dos CPU al mismo tiempo, el tiempo debería reducirse a la mitad, pero ahora aumenta en lugar de disminuir.
¿Qué causa que el proceso multiproceso sea lento en lugar de rápido?
La razón está en GIL. En el intérprete de Cpython, hay un bloqueo de intérprete global (Global Interpreter Lock). Cuando el intérprete interpreta y ejecuta código Python, primero debe obtener este bloqueo, lo que significa que en en cualquier momento Solo puede haber un subproceso ejecutando código. Si otros subprocesos desean obtener las instrucciones del código de ejecución de la CPU, primero deben obtener el bloqueo. Si el bloqueo está ocupado por otros subprocesos, el subproceso solo puede esperar hasta que el subproceso ocupe el código. El bloqueo se libera. Solo con bloqueos es posible ejecutar instrucciones de código.
Por lo tanto, esta es la razón por la que dos subprocesos que se ejecutan juntos son más lentos, porque al mismo tiempo, solo se está ejecutando un subproceso y otros subprocesos solo pueden esperar. Incluso una CPU de múltiples núcleos no puede permitir que se ejecuten varios subprocesos. Los subprocesos que ejecutan código en paralelo solo se pueden ejecutar alternativamente, porque el subproceso múltiple implica el cambio de contexto en línea y el procesamiento del mecanismo de bloqueo (adquirir bloqueos, liberar bloqueos, etc.), por lo que la ejecución de subprocesos múltiples no es rápida sino lenta.