2010-08-18 21 views

Respuesta

-1

¿Ha considerado utilizar una de las bibliotecas python mpi como mpi4py? Aunque MPI se usa normalmente para distribuir trabajo en un clúster, funciona bastante bien en una sola máquina multinúcleo. La desventaja es que tendrá que refactorizar su código para usar las llamadas de comunicación de MPI (lo cual puede ser fácil).

7

Eche un vistazo a multiprocessing. Es un hecho que a menudo se pasa por alto que no compartir datos de manera global, y no meter montones de hilos en un solo proceso es lo que prefieren los sistemas operativos.

Si aún insiste en que su comportamiento intensivo de CPU requiere enhebrar, consulte la documentación para working with the GIL in C. Es bastante informativo.

+0

El mayor problema que encontré al tratar de usar multiprocesamiento vs subprocesamiento es que al intentar ejecutar más de 1000 subprocesos (procesos) es que se obtiene una instancia separada del intérprete de Python con cada uno. Esto se vuelve extremadamente caro en términos de memoria. – Andy

+0

@nalroff: Eso no suena bien. La memoria utilizada para la mayoría del intérprete es compartida por todas las instancias de ese intérprete. Solo las páginas que difieren aumentarán el uso total de la memoria. Asegúrese de estar buscando el valor correcto.También vale la pena señalar que los procesos no usan mucha más memoria que los subprocesos adicionales. –

+0

En cada instancia que he usado el módulo de multiprocesamiento en Python, siempre he visto una diferencia dramática en el uso de la memoria entre los procesos y los hilos. De todos modos, el módulo de subprocesamiento parece ser lo suficientemente rápido para raspar web con hilos y pruebas de rendimiento de una aplicación web, que es todo lo que estoy usando para todos modos. – Andy

9

Ya puede dividir un programa de Python en múltiples procesos. El sistema operativo ya asignará sus procesos en todos los núcleos.

Haga esto.

python part1.py | python part2.py | python part3.py | ... etc. 

El sistema operativo se asegurará de que la pieza utilice tantos recursos como sea posible. Puede pasar información trivialmente a lo largo de esta tubería utilizando cPickle en sys.stdin y sys.stdout.

Sin demasiado trabajo, esto a menudo puede conducir a aceleraciones dramáticas.

Sí, hasta el haterz, es posible construir un algoritmo tan torturado que no se acelere demasiado. Sin embargo, esto a menudo rinde enormes beneficios por un trabajo mínimo.

Y.

La reestructuración para este propósito será exactamente coincidir con la reestructuración necesaria para maximizar la concurrencia de subprocesos. Asi que. Comience con el paralelismo de procesos de nada compartido hasta que pueda probar que compartir más información ayudaría, luego pase al paralelismo de hilos compartidos más complejo.

1

Este es un buen uso de la extensión C. La palabra clave que debe buscar es Py_BEGIN_ALLOW_THREADS.

http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock

P. S. Quiero decir, si su procesamiento ya está en C, como el procesamiento de imágenes, luego suelte el bloqueo en la extensión C es bueno. Si su código de procesamiento está principalmente en Python, la sugerencia de otras personas para multiprocessing es mejor. Por lo general, no es justificado reescribir el código en C para procesar el fondo.

-1

multiprocesamiento es fácil. si eso no es lo suficientemente rápido, tu pregunta es complicada.

Cuestiones relacionadas