2011-01-17 14 views
29

¿Cuáles son algunas buenas pautas a seguir cuando se decide utilizar subprocesos o multiprocesamiento cuando se habla en términos de eficiencia y claridad de código?Python: cuándo usar subprocesos frente a multiprocesamiento

+5

Se olvidó "ciclo de evento". –

+2

Cualquier buena respuesta necesita mencionar los efectos secundarios debido al bloqueo de intérprete global cuando se utilizan subprocesos. –

+0

@Mike DeSimone - ¡Estoy de acuerdo! :) – Russ

Respuesta

16

Muchas de las diferencias entre el subprocesamiento y el multiproceso no son realmente específicas de Python, y algunas diferencias son específicas de una determinada implementación de Python.

Para CPython, me gustaría utilizar el módulo multiprocessing en cualquiera de las FO los siguientes casos:

  • Necesito hacer uso de múltiples núcleos de forma simultánea por razones de rendimiento. El bloqueo de intérprete global (GIL) evitaría cualquier aceleración cuando se usan subprocesos. (En ocasiones, puede salirse con la suya en este caso, por ejemplo, cuando el trabajo principal se realiza en código C llamado a través del ctypes o cuando se usa Cython y se libera explícitamente el GIL donde corresponda. Por supuesto, este último requiere atención especial). este caso es realmente bastante raro. La mayoría de las aplicaciones no están limitadas por el tiempo del procesador, y si realmente lo son, generalmente no usas Python.

  • Deseo convertir posteriormente mi aplicación en una aplicación real distribuida. Esto es mucho más fácil de hacer para una aplicación de multiprocesamiento.

  • Se necesita muy poco estado compartido entre las tareas que se realizarán.

En casi todas las demás circunstancias, yo usaría hilos. (Esto incluye aplicaciones de interfaz gráfica de respuesta.)

6

Para la claridad del código , una de las cosas más importantes es aprender a conocer y amar el objeto Queue para hablar entre hilos (o procesos, si se utiliza multiprocessing ... multiprocesamiento tiene its own Queue object). Las colas hacen las cosas mucho más fáciles y creo que permiten un código mucho más limpio.

tuve a look para algunos ejemplos de cola decente, y éste tiene algunos grandes ejemplos de cómo usarlos y lo útiles que son (con exactamente la misma lógica aplica para la cola de multiprocesamiento): http://effbot.org/librarybook/queue.htm

Para eficiencia, los detalles y el resultado pueden no afectar notablemente a la mayoría de las personas, pero para python < = 3.1 la implementación de CPython tiene algunos problemas de eficiencia (y potencialmente brutales) en máquinas multinúcleo que tal vez desee conocer. Estos problemas implican the GIL. David Beazley hizo a video presentation hace un tiempo y es definitivamente vale la pena mirar. Más información here, incluyendo un seguimiento hablando de mejoras significativas en este frente en Python 3.2.

Básicamente, mi resumen barato del problema multinúcleo relacionado con GIL es que si espera obtener un uso completo de múltiples procesadores fuera de CPython < = 2.7 mediante el uso de varios subprocesos, no se sorprenda si el rendimiento no es bueno , o incluso peor que un solo núcleo. Pero si sus hilos están haciendo un montón de E/S (lectura/escritura de archivos, acceso a BD, lectura/escritura de zócalos, etc.), es posible que ni siquiera note el problema.

El módulo de multiprocesamiento evita por completo este problema potencial de GIL mediante la creación de un intérprete python (y GIL) por procesador.

+1

Para la mayoría del código de Python, tampoco obtendrás ninguna aceleración de múltiples subprocesos en Python 3.x; ya no será más lento. –

+0

@Sven: no creo que sea justo decir "más código". ¡Depende seriamente de qué es el código! es decir, cuánto tiempo pasa esperando el código para que las cosas que no son python se completen, tiempo durante el cual otro subproceso de python puede tararear. Si se realiza una gran cantidad de E/S, se trabaja con una GUI o se trabaja con extensiones pesadas de procesador C (suponiendo que liberen el GIL), los hilos pueden marcar una gran diferencia. Dependiendo de con quién hable, "la mayoría del código" incluye servidores web, en cuyo caso [muchos sabores se enrutan con gran ventaja] (http://nichol.as/benchmark-of-python-web-servers). – Russ

+0

Viniendo del crujido de números paralelos, usar hilos para hacer cosas mientras otro hilo está bloqueando (como en el código GUI) no es exactamente lo que llamo [aceleración] (http://en.wikipedia.org/wiki/Speedup) (I mencionado estos casos de uso en mi respuesta). Y por eso puedes obtener una aceleración para las extensiones de C pesadas en el procesador, pero eso no es exactamente lo que llamaría el código de Python :) Honestamente, tienes razón, mi comentario no era muy claro. –

Cuestiones relacionadas