Python Language Conceptos básicos de multihilo


Ejemplo

Usando el módulo de threading , se puede iniciar un nuevo subproceso de ejecución creando un nuevo threading.Thread y asigne una función para ejecutar:

import threading

def foo():
  print "Hello threading!"

my_thread = threading.Thread(target=foo)

El parámetro de target referencia a la función (u objeto llamable) que se ejecutará. El subproceso no comenzará la ejecución hasta que se llame al start en el objeto Thread .

Comenzando un hilo

my_thread.start() # prints 'Hello threading!'

Ahora que my_thread ha ejecutado y finalizado, al start nuevo, se producirá un RuntimeError . Si desea ejecutar su hilo como un demonio, pasar el daemon=True kwarg, o configurar my_thread.daemon en True antes de llamar a start() , hace que su Thread ejecute silenciosamente en segundo plano como un demonio.

Unirse a un hilo

En los casos en que divide un trabajo grande en varios pequeños y desea ejecutarlos simultáneamente, pero debe esperar a que todos terminen antes de continuar, Thread.join() es el método que está buscando.

Por ejemplo, supongamos que desea descargar varias páginas de un sitio web y compilarlas en una sola página. Tu harias esto

import requests
from threading import Thread
from queue import Queue

q = Queue(maxsize=20)
def put_page_to_q(page_num):
    q.put(requests.get('http://some-website.com/page_%s.html' % page_num)

def compile(q):
    # magic function that needs all pages before being able to be executed
    if not q.full():
        raise ValueError
    else:
        print("Done compiling!")

threads = []
for page_num in range(20):
     t = Thread(target=requests.get, args=(page_num,))
     t.start()
     threads.append(t)

# Next, join all threads to make sure all threads are done running before
# we continue. join() is a blocking call (unless specified otherwise using 
# the kwarg blocking=False when calling join)
for t in threads:
    t.join()

# Call compile() now, since all threads have completed
compile(q)

Una mirada más cercana a cómo funciona join() se puede encontrar aquí .

Crear una clase de hilo personalizado

Usando la clase threading.Thread podemos subclasificar la nueva clase Thread personalizada. debemos anular el método de run en una subclase.

from threading import Thread
import time

class Sleepy(Thread):

    def run(self):
        time.sleep(5)
        print("Hello form Thread")

if __name__ == "__main__":
    t = Sleepy()
    t.start()      # start method automatic call Thread class run method.
    # print 'The main program continues to run in foreground.'
    t.join()
    print("The main program continues to run in the foreground.")