2008-08-27 15 views
73

He estado tratando de entender cómo funcionan los hilos en Python, y es difícil encontrar buena información sobre cómo funcionan. Puede que me esté perdiendo un enlace o algo así, pero parece que la documentación oficial no es muy completa sobre el tema, y ​​no he podido encontrar un buen artículo.¿Cómo funcionan los subprocesos en Python, y cuáles son los peligros específicos de Python-threading?

De lo que puedo decir, sólo un hilo puede estar en ejecución a la vez, y el hilo activo cambia cada 10 instrucciones más o menos?

¿Dónde hay una buena explicación, o se puede proporcionar uno? También sería muy agradable estar al tanto de los problemas comunes con los que se tropieza al usar hilos con Python.

Respuesta

46

Sí, debido a la intérprete de bloqueo global (GIL) sólo puede ejecutar un hilo a la vez.Estos son algunos enlaces con algunas ideas acerca de esto:

Desde el último eslabón de una cita interesante:

Voy a explicar lo que todo eso significa. Los subprocesos se ejecutan dentro de la misma máquina virtual y, por lo tanto, se ejecutan en la misma máquina física . Los procesos pueden ejecutarse en la misma máquina física o en otra máquina física. Si diseña su aplicación alrededor de los hilos , no ha hecho nada para acceder a las máquinas múltiples . Por lo tanto, puede escalar a tantos núcleos en la única máquina (que serán unos cuantos a lo largo del tiempo), pero para realmente alcanzar las escalas web , deberá resolver el problema de la máquina múltiple de todos modos.

Si desea utilizar multi core, pyprocessing define una API basada en proceso de hacer la paralelización real. El PEP también incluye algunos puntos de referencia interesantes.

+1

Realmente un comentario sobre la cita de smoothspan: seguramente el enhebrado de Python efectivamente te limita a un núcleo, incluso si la máquina tiene varios?Puede haber beneficios de multinúcleo, ya que el siguiente subproceso puede estar listo sin un cambio de contexto, pero sus subprocesos de Python nunca pueden hacer uso de> 1 núcleo a la vez. –

+2

Correcto, los hilos de python están prácticamente limitados al núcleo único, A MENOS QUE un módulo C interactúe muy bien con el GIL, y ejecuta su propio hilo nativo. – Arafangion

+0

En realidad, los núcleos múltiples hacen que los hilos _son_ eficientes ya que hay mucha falta de mantenimiento al verificar si cada hilo puede acceder al GIL. Incluso con el nuevo GIL, el rendimiento es aún peor ... http://www.dabeaz.com/python/NewGIL.pdf – Basic

18

A continuación se muestra un ejemplo básico de roscado. Engendrará 20 hilos; cada hilo dará salida a su número de hilo. Ejecútelo y observe el orden en que se imprimen.

import threading 
class Foo (threading.Thread): 
    def __init__(self,x): 
     self.__x = x 
     threading.Thread.__init__(self) 
    def run (self): 
      print str(self.__x) 

for x in xrange(20): 
    Foo(x).start() 

Como ha insinuado, los hilos de Python se implementan a través del corte de tiempo. Así es como obtienen el efecto "paralelo".

En mi ejemplo, mi clase Foo amplía el hilo, luego implemento el método run, que es donde va el código que desea ejecutar en un hilo. Para iniciar el hilo, llame al start() en el objeto de hilo, que invocará automáticamente el método run ...

Por supuesto, esto es solo lo básico. Eventualmente querrás aprender sobre semáforos, mutexes y bloqueos para la sincronización de hilos y el envío de mensajes.

34

Python un lenguaje bastante fácil de hilo, pero hay advertencias. Lo más importante que debe saber es el bloqueo de intérprete global. Esto permite que solo un hilo acceda al intérprete. Esto significa dos cosas: 1) rara vez se encuentra utilizando una declaración de bloqueo en python y 2) si desea aprovechar los sistemas multiprocesador, debe usar procesos separados. EDITAR: También debo señalar que puede poner algo del código en C/C++ si también quiere sortear el GIL.

Por lo tanto, es necesario volver a considerar por qué desea utilizar hilos. Si desea paralelizar su aplicación para aprovechar la arquitectura de doble núcleo, debe considerar dividir su aplicación en múltiples procesos.

Si se quiere mejorar la capacidad de respuesta, se debe considerar el uso de hilos. Sin embargo, existen otras alternativas, a saber, microthreading. También hay algunos marcos que usted debe buscar en:

+0

@JS - Solucionado. Esa lista estaba desactualizada de todos modos. –

+0

Me parece mal que necesite múltiples procesos, con todos los gastos generales que conlleva, para aprovechar un sistema multi-core. Tenemos algunos servidores con 32 núcleos lógicos, entonces ¿necesito 32 procesos para utilizarlos de manera eficiente? Locura – Basic

+0

@Basic - La sobrecarga en el inicio de un proceso frente a comenzar un hilo en estos días es mínimo. Supongo que puede comenzar a ver problemas si estamos hablando de miles de consultas por segundo, pero en primer lugar cuestionaría la elección de Python para un servicio tan ocupado. –

9

Use hilos en python si los trabajadores están realizando operaciones de E/S vinculadas. Si intenta escalar a través de múltiples núcleos en una máquina, encuentre un buen marco IPC para python o elija un idioma diferente.

1

Trate de recordar que el GIL está configurado para sondear de vez en cuando para mostrar la apariencia de varias tareas. Esta configuración puede ser ajustada, pero ofrezco la sugerencia de que debería haber trabajo que los hilos están haciendo o muchos interruptores de contexto van a causar problemas.

Me atrevería a sugerir varios padres en los procesadores y tratar de mantener trabajos similares en el mismo núcleo (s).

2

Una solución fácil para el GIL es el módulo multiprocessing. Se puede utilizar como un reemplazo en el módulo de subprocesamiento pero utiliza múltiples procesos de Intérprete en lugar de subprocesos. Debido a esto, hay un poco más de sobrecarga que un simple enhebrado para cosas simples, pero le da la ventaja de una paralelización real si la necesita. También escala fácilmente a varias máquinas físicas.

Si necesita una paralelización a gran escala mayor de la que yo buscaría más adelante, pero si solo desea escalar a todos los núcleos de una computadora o unas pocas sin todo el trabajo que implicaría implementar un marco más completo, entonces Esto es para ti.

Cuestiones relacionadas