python multiprocessing cpu-cores

Límite del proceso Pool de Python multiprocessing



cpu-cores (4)

Al utilizar el objeto Pool desde el módulo de multiprocesamiento, ¿el número de procesos está limitado por el número de núcleos de CPU? Por ejemplo, si tengo 4 núcleos, incluso si creo un grupo con 8 procesos, ¿solo se ejecutarán 4 al mismo tiempo?


Eso es correcto. Si tiene 4 núcleos, entonces se pueden ejecutar 4 procesos a la vez. Recuerda que tienes cosas del sistema que deben continuar, y sería bueno que definieras el número de proceso como number_of_cores - 1 . Esta es una preferencia y no es obligatoria. Para cada proceso que creas hay sobrecarga, por lo que en realidad estás usando más memoria para hacer esto. Pero si la RAM no es un problema, entonces adelante. Si está ejecutando Cuda o alguna otra biblioteca basada en GPU, entonces tiene un paradigma diferente, pero eso es para otra pregunta.


Sí. Teóricamente, no hay límite en los procesos que puede crear, pero una cantidad increíble de procesos iniciados a la vez causarán la muerte del sistema debido a la falta de memoria. Tenga en cuenta que los procesos ocupan mucho más espacio que los hilos, ya que no usan el espacio compartido entre ellos, sino que utilizan un espacio individual para cada proceso.

por lo tanto, la mejor práctica de programación es usar un semáforo restringido al número de procesadores de su sistema. probable

pool = multiprocessing.Semaphore(4) # no of cpus of your system.

Si no conoce el número de núcleos de su sistema o si desea utilizar el código en muchos sistemas, un código genérico como el que se muestra a continuación lo hará ...

pool = multiprocessing.Semaphore(multiprocessing.cpu_count()) #this will detect the number of cores in your system and creates a semaphore with that value.

PS Pero es bueno usar número de cores-1 siempre.

Espero que esto ayude :)


Si bien no hay un límite que pueda establecer, si desea comprender un número conveniente para usar en los procesos vinculados a la CPU (que sospecho que está buscando aquí), puede ejecutar lo siguiente:

>>> import multiprocessing >>> multiprocessing.cpu_count() 1

Algunas buenas notas sobre limitaciones (especialmente en Linux) se indican en la respuesta here :


Puedes solicitar tantos procesos como quieras. Cualquier límite que pueda existir será impuesto por su sistema operativo, no por multiprocessing . Por ejemplo,

p = multiprocessing.Pool(1000000)

Es probable que sufra una muerte fea en cualquier máquina. Lo estoy probando en mi caja mientras escribo esto, y el sistema operativo está moliendo mi disco para quitar el polvo de la memoria RAM enloquecido - finalmente lo maté después de haber creado unos 3000 procesos ;-)

En cuanto a cuántos se ejecutarán "a la vez", Python no tiene nada que decir al respecto. Depende de:

  1. Cuántos es capaz de ejecutar su hardware simultáneamente; y,
  2. Cómo su sistema operativo decide dar recursos de hardware a todos los procesos en su máquina actualmente en ejecución.

Para las tareas vinculadas a la CPU, no tiene sentido crear más procesos de grupo de los que tiene núcleos para ejecutarlos. Si también está intentando usar su máquina para otras cosas, debería crear menos procesos que núcleos.

Para las tareas relacionadas con la E / S, puede tener sentido crear un número bastante mayor Pool procesos de agrupación que de núcleos, ya que los procesos probablemente pasarán la mayor parte del tiempo bloqueados (a la espera de que se complete la E / S).