Si todos sus subprocesos/procesos están vinculados a la CPU, debe ejecutar tantos procesos como la CPU informe los núcleos. Debido a HyperThreading, cada núcleo de CPU físico puede presentar múltiples núcleos virtuales. Llame al multiprocessing.cpu_count
para obtener la cantidad de núcleos virtuales.
Si solamente p de 1 de los hilos es vinculado a la CPU, se puede ajustar ese número multiplicando por p. Por ejemplo, si la mitad de sus procesos están vinculados a la CPU (p = 0.5) y tiene dos CPU con 4 núcleos cada uno y 2x HyperThreading, debe iniciar 0.5 * 2 * 4 * 2 = 8 procesos.
Si tiene muy pocos procesos, la aplicación se ejecutará más despacio de lo esperado. Si su aplicación se escala perfectamente y solo está unida a la CPU (es decir, es 10 veces más rápida cuando se ejecuta en 10 veces la cantidad de núcleos), esto significa que la velocidad es más lenta en relación. Por ejemplo, si su sistema requiere 8 procesos, pero solo inicia 4, solo usará la mitad de la capacidad de procesamiento y tardará el doble. Tenga en cuenta que, en la práctica, ninguna aplicación escala perfectamente, pero algunas (trazado de rayos, codificación de video) son bastante cercanas.
Si tiene demasiados procesos, la sobrecarga de sincronización aumentará. Si su programa tiene una sobrecarga de sincronización pequeña, esto no afectará el tiempo de ejecución general, pero puede hacer que otros programas aparezcan más lentos de lo que son a menos que establezca sus procesos con una prioridad más baja. Un número excesivo de procesos (digamos, 10000) está bien en teoría si su sistema operativo tiene un buen programador. En la práctica, prácticamente cualquier sincronización hará que la sobrecarga sea insoportable.
Si no está seguro de si su aplicación está unida a la CPU y/o a escala perfecta, simplemente observe la carga del sistema con diferentes conteos de hilos. Desea que la carga del sistema sea ligeramente inferior al 100%, o la más precisa sea uptime como el número de núcleos virtuales.
Gracias por la gran respuesta. No sabía todo eso. ¿Qué pasa si hay un poco de partes no vinculadas a la CPU en la aplicación? Por ejemplo, una gran cantidad de cálculos de la CPU, pero luego el resultado final se guarda en el archivo o la base de datos. ¿Eso significa que debería crear más procesos ya que algunos tienen que esperar a la red final (base de datos) o a la escritura en el disco (escritura de archivos)? – Lostsoul
@Lostsoul En general, sí, si la cuota de actividad vinculada al disco es significativa. Si está escribiendo un archivo de suma breve (por ejemplo, la imagen después de raytracing una escena complicada), este efecto es insignificante.Si su aplicación lee y escribe muchos datos, debería aumentar la cantidad de procesos. Se actualizó la respuesta con un párrafo: ¡si no está seguro, pruébelo! – phihag
Solo para agregar a la parte de observación: obviamente desea evitar que la utilización de la CPU aumente debido a la sobrecarga de sincronización. Por lo tanto, al realizar el experimento, debe medir tanto la carga del sistema como el rendimiento de la aplicación. – millimoose