2010-06-07 10 views
22

¿Cuáles son las opciones para lograr el paralelismo en Python? Quiero realizar un montón de cálculos de CPU vinculados sobre algunos rásteres muy grandes, y me gustaría paralelizarlos. Procedente de C, estoy familiarizado con tres enfoques de paralelismo:Paralelismo en Python

  1. Procesos de aprobación de mensajes, posiblemente distribuidos en un clúster, p. MPI.
  2. explícita paralelismo de memoria compartida, ya sea usando pthreads o tenedor(), tubo(), et. al
  3. paralelismo de memoria implícita compartida, usando OpenMP.

Decidir sobre un enfoque de uso es un ejercicio de compensaciones.

En Python, ¿qué enfoques están disponibles y cuáles son sus características? ¿Hay un clon de MPI clon? ¿Cuáles son las formas preferidas de lograr el paralelismo de la memoria compartida? He oído referencias a problemas con GIL, así como referencias a tasklets.

En resumen, ¿qué necesito saber sobre las diferentes estrategias de paralelización en Python antes de elegir entre ellas?

Respuesta

13

En general, describe un cálculo de límite de CPU. Este no es el fuerte de Python. Ninguno, históricamente, es multiprocesamiento.

Enhebrado en la corriente principal El intérprete de Python se ha regido por un temido bloqueo global. La nueva API multiprocessing funciona alrededor de eso y ofrece una abstracción de grupos de trabajadores con tuberías y colas, etc.

Puede escribir su código crítico de rendimiento en C o Cython, y usar Python para el pegamento.

5

El nuevo (2.6) multiprocessing módulo es el camino a seguir. Utiliza subprocesos, lo que evita el problema GIL. También abstrae algunos de los problemas locales/remotos, por lo que la opción de ejecutar su código localmente o distribuirlos en un clúster puede realizarse más adelante. La documentación que he vinculado anteriormente es bastante para morder, pero debe proporcionar una buena base para comenzar.

0

Hay muchos paquetes para hacer eso, el más apropiado ya que otros dicen que es multiprocesamiento, especialmente con la clase "Pool".

Se puede obtener un resultado similar por parallel python, que además está diseñado para trabajar con clusters.

De todos modos, yo diría que vaya con multiprocesamiento.

0

Según la cantidad de datos que necesite procesar y la cantidad de CPU/máquinas que desee utilizar, en algunos casos es mejor escribir una parte en C (o Java/C# si desea usar jython/IronPython)

La aceleración que puede obtener puede hacer más por su rendimiento que ejecutar cosas en paralelo en 8 CPU.

Cuestiones relacionadas