martes, 30 de octubre de 2018

Unidad 3: Threads /Hilos en Python

Threads /Hilos en Python


Los threads son un concepto similar a los procesos: también se trata de código en ejecución. Sin embargo los threads se ejecutan dentro de un proceso, y los threads del proceso comparten recursos entre si, como la memoria, por ejemplo.

El sistema operativo necesita menos recursos para crear y gestionar los threads, y al compartir recursos, el cambio de contexto es más rápido. Además, dado que los threads comparten el mismo espacio de memoria global, es sencillo compartir información entre ellos: cualquier variable global que tengamos en nuestro programa es vista por todos los threads.

EL GIL

La ejecución de los threads en Python está controlada por el GIL (Global Interpreter Lock) de forma que sólo un thread puede ejecutarse a la vez, independientemente del número de procesadores con el que cuente la máquina.

THREADS EN PYTHON

El trabajo con threads se lleva a cabo en Python mediante el módulo thread. Este módulo es opcional y dependiente de la plataforma, y puede ser necesario, aunque no es común, recompilar el intérprete para añadir el soporte de threads.

Además de thread, también contamos con el módulo threading que se apoya en el primero para proporcionarnos una API de más alto nivel, más completa, y orientada a objetos. El módulo threading se basa ligeramente en el modelo de threads de Java.

El módulo threading contiene una clase Thread que debemos extender para crear nuestros propios hilos de ejecución. El método run contendrá el código que queremos que ejecute el thread. Si queremos especificar nuestro propio constructor, este deberá llamar a threading.Thread.__init__(self) para inicializar el objeto correctamente.

import threading  
  
class MiThread(threading.Thread):  
      def __init__(self, num):  
          threading.Thread.__init__(self)  
          self.num = num  
  
      def run(self):  
          print "Soy el hilo", self.num  


Para que el thread comience a ejecutar su código basta con crear una instancia de la clase que acabamos de definir y llamar a su método start. El código del hilo principal y el del que acabamos de crear se ejecutarán de forma concurrente.

print "Soy el hilo principal"  
  
for i in range(0, 10):  
    t = MiThread(i)  
    t.start()  
    t.join()  



Programa que usa dos hilos. 
Código:

import time
import thread

def imprimir_mensaje(mensaje):
    while True:
        print(mensaje)
        time.sleep(1)


def main():
    mensaje = "Thread1" #variable aux
    mensaje2 = "Thread2"  # variable aux
    #empiezo el thread
    thread.start_new_thread(imprimir_mensaje, (mensaje,))
    thread.start_new_thread(imprimir_mensaje, (mensaje2,))

    x = raw_input("estoy esperando que presiones enter...\n")

    print ("Termino la funcion main")
main()



Ejecución:



Referencia: https://www.youtube.com/watch?v=4HKy5nNEqeQ
Referencia: http://mundogeek.net/archivos/2008/04/18/threads-en-python/


No hay comentarios:

Publicar un comentario