
Trabajo en un clúster compartido. He visto personas ejecutar código c paralelizado en este clúster que, cuando uso top
para ver qué procesos se están ejecutando, se muestra que usan (por ejemplo) el 400% de la CPU, ya que están usando cuatro procesadores para una sola instancia de su código.
Ahora alguien está ejecutando (lo que según he oído) un código Python paralelizado. Sin embargo, en lugar de top
mostrar que el código Python usa el 400% de la CPU, se muestra como cuatro procesos diferentes, cada uno usando su propio procesador (al 100%).
Me pregunto: ¿Python (cuando está en paralelo) se muestra con top
tantos procesos diferentes en ejecución (a diferencia de C) o este código de Python en realidad no se ejecuta en paralelo?
No sé si Stack Exchange sería un mejor lugar para esta pregunta. Como lo estoy usando, top
pensé que este lugar sería mejor. Déjame saber si debo moverlo.
Respuesta1
Lo que ves en C es el uso de subprocesos, por lo que el uso del proceso es el total de todos sus subprocesos. Si hay 4 subprocesos con un uso de CPU del 100% cada uno, el proceso se mostrará como 400%
Lo que ves en Python es casi con certeza paralelismo a través del modelo multiproceso. Ese es un modelo destinado a superar las limitaciones de subprocesamiento de Python. Python solo puede ejecutar un subproceso a la vez (consulte Python Global Interpreter Lock - GIL). Para hacerlo mejor que eso, se puede usar el módulo multiproceso que termina creando procesos en lugar de subprocesos, que a su vez se muestran en ps como procesos múltiples, que luego pueden usar hasta el 100% de la CPU cada uno, ya que son (cada uno) de un solo proceso. roscado.
Apuesto a que si ejecutas ps -afeT
verás los subprocesos del programa C pero ningún subproceso adicional para el programa Python.
Respuesta2
La implementación de Python de referencia, CPython, tiene el bloqueo global de intérprete (GIL), que le impide ejecutar código enparalelo, soloal mismo tiempo. El subprocesamiento sólo es útil para E/S. Necesita múltiples procesos para poder ejecutarse en paralelo. Es probable que el código C que está viendo utilice subprocesos para el paralelismo.