1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import random
import threading
ingredientes = ['tabaco', 'papel', 'cerillo']
semaforos = {}
semaforo_agente = threading.Semaphore(1)
for i in ingredientes:
    semaforos[i] = threading.Semaphore(0)

    threading.Thread(target=agente, args=[]).start()
    fumadores = [threading.Thread(target=fumador, args=[i]).start() for i in ingredientes]

def agente():
    while True:
        semaforo_agente.acquire()
        mis_ingr = ingredientes[:]
        mis_ingr.remove(random.choice(mis_ingr))
        for i in mis_ingr:
            print "Proveyendo %s" % i
            semaforos[i].release()

def fumador(ingr):
    mis_semaf = []
    for i in semaforos.keys():
        if i != ingr:
            mis_semaf.append(semaforos[i])
        while True:
            for i in mis_semaf:
                i.acquire()
            fuma(ingr)
            semaforo_agente.release()

def fuma(ingr):
    print 'Fumador con %s echando humo...' % ingr