Si sientes que los ejemplos de Threads (Part I) se te quedan pequeños, hoy te traigo un mejor ejemplo (y bien conocido). Se trata del productor-consumidor
. Este ejemplo, para quien no lo conozca, está basado en dos actores, uno que produce algo (números en este caso) y otro que los consume. Es una ejemplo típico de concurrencia, y ésta es su versión python:
from threading import Thread, Lock array = [] myLock = Lock () elements = 10 class Producer (Thread): def run (self): for i in range (elements): myLock.acquire () array.append (i) myLock.release () print '-> Produced %d' % i class Consumer (Thread): def run (self): consumed = 0 while consumed < elements: myLock.acquire () if len (array) > 0: e = array[0] del array[0] myLock.release () print '<- Consumed %d' % e consumed += 1 if __name__ == '__main__': p1 = Producer () p2 = Producer () c1 = Consumer () c2 = Consumer () p1.start () c1.start () p2.start () c2.start () p1.join () p2.join () c1.join () c2.join ()
Lo primero que se observa es la declaración de variables, incluyendo un Lock (o candado) para el acceder correctamente a la variable compartida array. Después se definen las dos clases principales, una para el productor y la otra para el consumidor. En el final, en el programa principal, se crean dos productores y dos consumidores y se ejecutan hasta el final. Para que los threads acaben correctamente, debes hacer join de todas las instancias. La salida que muestra el script es la siguiente:
-> Produced 0 -> Produced 1 -> Produced 2 -> Produced 3 -> Produced 4 -> Produced 5 -> Produced 6 -> Produced 7 -> Produced 8 <- Consumed 0 <- Consumed 1 <- Consumed 2 -> Produced 9 <- Consumed 3 <- Consumed 4 <- Consumed 5 <- Consumed 6 <- Consumed 7 -> Produced 0 -> Produced 1 -> Produced 2 <- Consumed 8 <- Consumed 9 -> Produced 3 -> Produced 4 -> Produced 5 -> Produced 6 -> Produced 7 <- Consumed 0 <- Consumed 1 <- Consumed 2 <- Consumed 3 <- Consumed 4 -> Produced 8 -> Produced 9 <- Consumed 5 <- Consumed 6 <- Consumed 7 <- Consumed 8 <- Consumed 9
Esto es todo por ahora, mantente a la escucha
. Nos vemos!