es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Entendiendo la seguridad de hilos en la función pool map de Python.

Esta pregunta tenía respuestas contradictorias: https://stackoverflow.com/questions/40351628/are-python-multiprocessing-pool-thread-safe

Soy nuevo en los patrones de concurrencia y estoy intentando ejecutar un proyecto que toma una matriz y distribuye el trabajo de la matriz en múltiples procesos. La matriz es grande.

inputs = range(100000)
with Pool(2) as pool:
  res = pool.map(some_func, inputs)

Mi comprensión es que el pool distribuirá las tareas a los procesos. Mis preguntas son las siguientes:

1) ¿Es segura esta operación map en cuanto a hilos? ¿Dos procesos podrían intentar procesar accidentalmente el mismo valor?
2) Entiendo superficialmente que las tareas se dividirán en fragmentos y se enviarán a los procesos. Sin embargo, si diferentes entradas tardan más que otras, ¿el trabajo siempre se distribuirá de manera equitativa entre mis procesos? ¿Podría darse el caso de que un proceso se quede colgado pero tenga una larga cola de tareas por hacer mientras que los otros procesos están inactivos?
3) Mi comprensión es que, dado que solo estoy leyendo entradas, no necesito utilizar patrones de comunicación entre procesos como un administrador de servidor / memoria compartida. ¿Es correcto?
4) Si configuro más procesos que núcleos, ¿operará básicamente como hilos donde la CPU está alternando entre tareas?

¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    1) La operación map en multiprocessing.Pool es segura para subprocesos. Cada proceso en el grupo opera en su propio subconjunto de datos y no hay superposición entre los procesos. Cada proceso obtiene su propio espacio de memoria aislado y no interferirá con los demás.

    2) El trabajo se dividirá en fragmentos y se asignará a cada proceso disponible en el grupo. Es poco probable que el trabajo se distribuya siempre de manera uniforme, especialmente si algunas tareas tardan mucho más que otras. Sin embargo, el sistema intentará hacer que la distribución sea lo más justa posible. Si bien teóricamente es posible que un proceso se bloquee mientras otros están inactivos, la implementación de multiprocessing.Pool intenta evitar esta situación monitoreando cada proceso y reasignando el trabajo según sea necesario.

    3) Correcto, dado que solo estás leyendo entradas y escribiendo resultados, no necesitas usar ningún patrón explícito de comunicación entre procesos. Sin embargo, si necesitas compartir datos entre procesos o coordinar su comportamiento, es posible que necesites usar algún tipo de memoria compartida o esquema de envío de mensajes.

    4) Cuando creas más procesos de los que están disponibles en los núcleos, el sistema operativo alternará entre los procesos y les dará un tiempo para ejecutarse. Sin embargo, a diferencia de los hilos, cada proceso se ejecuta en su propio espacio de memoria independiente y no interferirá con los demás. El comportamiento exacto del sistema dependerá del sistema operativo y del algoritmo de programación que se esté utilizando.

Comments are closed.