parallel - python pool thread
Paralelismo en Python (4)
El nuevo módulo de multiprocessing (2.6) es el camino a seguir. Utiliza subprocesos, que solucionan el problema de GIL . También abstrae algunos de los problemas locales / remotos, por lo que la opción de ejecutar su código localmente o extenderse en un clúster se puede hacer más adelante. La documentación que he enlazado anteriormente es bastante buena para analizar, pero debería proporcionar una buena base para comenzar.
¿Cuáles son las opciones para lograr el paralelismo en Python? Quiero realizar un montón de cálculos vinculados a la CPU sobre algunos rásteres muy grandes, y me gustaría paralelizarlos. Con antecedentes en C, estoy familiarizado con tres enfoques para el paralelismo:
- Procesos de paso de mensajes, posiblemente distribuidos en un clúster, por ejemplo, MPI .
- Paralelismo explícito de memoria compartida, ya sea utilizando pthreads o fork () , pipe () , et. Alabama
- Implícito paralelismo de memoria compartida, utilizando 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 en clusterable? ¿Cuáles son las formas preferidas de lograr el paralelismo de memoria compartida? He escuchado referencias a problemas con la GIL , así como referencias a tasklets .
En resumen, ¿qué debo saber sobre las diferentes estrategias de paralelización en Python antes de elegir entre ellas?
En general, usted describe un cálculo de límite de CPU. Este no es el fuerte de Python. Tampoco, históricamente, es multiprocesamiento.
El subprocesamiento en el intérprete de Python se ha regido por un temido bloqueo global. La nueva API de multiprocessing funciona alrededor de eso y proporciona una abstracción de grupo de trabajadores con tuberías y colas y demás.
Puedes escribir tu código crítico de rendimiento en C o Cython , y usar Python para el pegamento.
Hay muchos paquetes para hacer eso, el más apropiado como se dice en otros es el multiprocesamiento, especialmente con la clase "Pool".
Se puede obtener un resultado similar con Python paralelo , que además está diseñado para trabajar con grupos.
De todos modos, yo diría que ir con multiprocesamiento.
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 de ella en C (o Java / C # si desea usar jython / IronPython)
La aceleración que puede obtener de eso puede hacer más por su rendimiento que ejecutar cosas en paralelo en 8 CPU.