81 votos

¿Cómo funcionan los hilos en Python, y cuáles son errores específicos comunes Python-threading?

He estado tratando de envolver mi cabeza en torno a cómo funcionan los hilos en Python, y es difícil encontrar buena información sobre la forma en que operan. Pensé que puede ser que falta un enlace o algo, pero parece que la documentación oficial no es muy exhaustivo sobre el tema, y no he sido capaz de encontrar un buen reportaje.

Por lo que puedo decir, sólo un thread puede estar funcionando a la vez, y la participación activa de hilo cambia cada 10 instrucciones o algo así?

Donde hay una buena explicación, o se puede proporcionar? También sería muy bueno ser conscientes de los problemas más comunes que se puede ejecutar en tanto que el uso de hilos con Python.

49voto

Peter Hoffmann Puntos 13823

Sí, porque el Bloqueo Global de Intérprete (GIL) no sólo puede ejecutar un hilo a la vez. Aquí hay algunos enlaces con algunas ideas sobre esto:

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

Permítanme explicar lo que todo esto significa. Los hilos se ejecutan dentro de la misma virtual de la máquina, y por lo tanto se ejecutan en el mismo física de la máquina. Los procesos se pueden ejecutar en la misma máquina o en otra máquina física. Si arquitecto de su aplicación alrededor de los hilos, usted no ha hecho nada para acceder a múltiples máquinas. Así, usted puede cambiar la escala de como muchos núcleos están en el único de la máquina (que será muy pocos a lo largo del tiempo), pero para realmente llegar a la web escalas, tendrás que resolver el múltiples máquinas problema de todos modos.

Si desea utilizar varios núcleos, pyprocessing define un proceso basado en la API para hacer real la paralelización. El PEP también incluye algunas interesantes puntos de referencia.

35voto

Jason Baker Puntos 56682

Python es bastante fácil de idioma para el hilo, pero hay que tener en cuenta. La cosa más grande que usted necesita saber sobre que es el Bloqueo Global de Intérprete. Esto permite que un solo hilo para acceder a la intérprete. Esto significa dos cosas: 1) que raramente se encontrará con una instrucción de bloqueo en python y 2) si usted desea tomar ventaja de los sistemas multiprocesador, usted tiene que utilizar procesos separados. EDIT: también debo señalar que se puede poner un poco de código en C/C++ si desea moverse por el GIL así.

Por lo tanto, es necesario re-examinar por qué desea utilizar hilos. Si desea ponerse en paralelo a su aplicación para tomar ventaja de doble núcleo de la arquitectura, usted necesita para considerar la posibilidad de romper su aplicación en múltiples procesos.

Si usted desea mejorar la capacidad de respuesta, usted debe CONSIDERAR el uso de hilos. Existen otras alternativas, aunque, a saber, microthreading. También hay algunos marcos que usted debe buscar en:

19voto

mmattax Puntos 10865

A continuación es un básico de roscado de la muestra. Engendrará 20 hilos; cada hilo de la salida de su número de hilo. Ejecutar y observar 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 usted ha insinuado Python hilos son implementadas a través de time-slicing. Esta es la forma de conseguir la "paralelo".

En mi ejemplo, mi clase Foo extiende hilo, luego de aplicar el run método, que es donde el código que se desea ejecutar en un hilo. Para empezar el hilo de llamada start() sobre el hilo objeto, que invocará automáticamente la run método de...

Por supuesto, esto es sólo la base. Eventualmente querrá aprender acerca de los semáforos, mutexes, y las trabas para la sincronización de subprocesos y paso de mensajes.

10voto

kazakdogofspace Puntos 1980

Utilizar subprocesos en python si los trabajadores individuales están haciendo operaciones de E/S limitado. Si están tratando de escalar a través de múltiples núcleos en una máquina o encontrar un buen marco IPC para python o elija un idioma diferente.

2voto

phreaki Puntos 38

Trate de recordar que el GIL se establece en encuesta por cada cierto tiempo para mostrar la aparición de múltiples tareas. Esta configuración puede ser bien afinado, pero hacer la sugerencia de que debería haber trabajo que están haciendo los hilos de rosca o un montón de cambios de contexto van a causar problemas.

Me ir tan lejos como para sugerir a los padres múltiples procesadores y tratar de mantener como puestos de trabajo en el mismo núcleo /-s.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: