Tutorial 20, Threads en python.

Hola a tod@s, hoy como os prometí ayer, hablaré sobre los Threads, vamos a ver, en un pc, puedes estar escuchando música, descargándote una película (eso si, en megaupload ya no), y estar a al mismo tiempo leyendo este fabuloso blog, pero.... ¿Cómo se consigue esto?, a través de una cosa que se llaman procesos, cada programa ejecuta un trocito de código, para su ejecución y guarda el estado donde estaba, luego empieza otro, al poco este otro para y guarda su estado y así todo el rato, dando la sensación de que se ejecutan procesos completamente paralelos.



Pero ese cambio de proceso es algo mas o menos lento y pesado, pero existen los Threads que son como procesos dentro de un proceso, por lo cual, como pertenecen a un mismo proceso pueden compartir información y es mas rápido el paso de un hilo a otro.


En python, los threads  se realizan a través del módulo threading (basado en el módulo mas prehistórico thread), y consiste en ir expandiendo la clase para añadir threads.

import threading

class hilo(threading.Thread):
           #el constructor no hace falta especificarlo ya que la clase lo hace por nosotros.
           def __init__(self): 
                   threading.Thread.__init__(self)
           def run(self):
                   while True:
                          print "se esta ejecutando el hilo1"
           #el método run es donde se debe introducir el código que se ejecuta en segundo plano.

class hilo2(threading.Thread):
             def run(self):
                    while True:
                           print "se esta ejecutando el hilo2"

Una vez que hemos creado los hilos como en este ejemplo, para ejecutarlos se haría de la siguiente forma:

mi_hilo1=hilo()
mi_hilo2=hilo2()

mi_hilo1.start()
mi_hilo2.start()

De esta forma conseguiríamos ejecutar dos "while True" al mismo tiempo, otra cosa que hay que explicar, es que cuando creamos un hilo, aparte de existir el método "start" para iniciar el hilo también existe el método "join", con este método se consigue bloquear la ejecución normal del programa hasta que termine el hilo, ejemplo:

class hilo(threading.Thread):
         def run(self):
                   mensaje=raw_input("escribe algo ")

mi_hilo=hilo()
mi_hilo.start()
mi_hilo.join()
print "se a cerrado el hilo"
raw_input()

En este caso hasta que no se escriba algo para terminar el hilo, no continuaría el programa.

También podemos crear un hilo a través de una función ya creada:

def suma(a, b):
          while True:
                a+=1
                b+=1
                print a+b

hilo=threading.Thread(target=suma, args=(5, 8))
hilo.start()
while True:
        print "este es el hilo principal del programa"

En este caso creamos a través de la función suma un hilo, lo único que creo que debería explicar, es que se usa la palabra reservada target para indicar la función que se va a ejecutar en el thread, y la palabra reservada args  que sirve para pasarle los argumentos a la función dentro de una tupla.

Bueno, esto es lo mas importante de los Threads, he hecho como en la interacción con webs, no es nada complicado ni avanzado, ya que no es necesario meternos demasiado en este tema, esto pensaba explicarlo en dos tutoriales pero bueno al final me he afanado y lo he escrito en uno, pero vamos, yo creo que mas o menos ha quedado claro el tema de los Threads en python.

Ahora quiero hablaros de una cosa IMPORTANTE, ya os he dado las cosas mas importantes en python, ya lleváis una muy buena base, la sintaxis y las cosas básicas las conocéis ya, así que me gustaría empezar a explicar como hacer juegos en python (algo simple, no esperéis un juego 3d), y así todo esto lo practicaríais y además podríamos hacer cosas interesantes, eso si, tendríais que darme unos días para que vaya yo también aprendiéndolo ya que ese tema aún no es mi fuerte, pero no quería empezar a hacerlo sin vuestra opinión, espero vuestras respuestas.

Un abrazo a tod@s.

6 comentarios:

Dr Coloso dijo...

Buenisimo el tutorial, que framework se usaria para hacer los juegos pygame, pilas, o algun otro.
pilas lo ves aca http://www.pilas-engine.com.ar

Francisco Dominguez Lerma dijo...

Dr Coloso, me alegra que te haya gustado el tutorial de hoy, pues yo usaría Pygame ya que es el mas sencillo, eso si, aún no se hacer juegos en python, tendríais que dejarme unos dias para que lo estudiara, eso si, si estáis interesados en el tema, por lo que he leído pygame es muy sencillo de aprender, pero claro, tengo que aprenderlo jeje.

Un saludo.

Francisco Dominguez Lerma dijo...

Aunque la verdad, no había leido nada sobre "pilas", le acabo de dar un vistazo y es extremadamente sencillo, así que, lo que voy a hacer es dejar la decisión en vuestras manos, voy a crear un tema para que decidáis esto por votación.

noge dijo...

Muchas gracias compi!! esta muy bien tu blog!! es de gran ayuda!! keep on!!

Francisco Dominguez Lerma dijo...

De nada noge, gracias por tu comentario y bienvenido a bordo!!

John Doe dijo...

Me gusto mucho, mucho, mucho, mucho.
habia leido treads en otros lados pero ponian ejemplos de 50 lineas y se alejaban del tema principal.

aqui lo entendi todito con el primer ejemplo