1 #! /usr/bin/env python2.4
13 class filosofo(threading.Thread):
14 def __init__(self, numeracion, cant):
15 threading.Thread.__init__(self)
17 self.rnd = random.Random()
18 self.cant = cant # cantidad de veces que va a comer
19 self.comi = 0 # cantidad de veces que comio
21 self.izquierdo = False
24 def agarrarPalitoDerecho(self):
25 if self.id+1 == len(palitos): ind = 0
27 semaforos[ind].acquire()
28 self.derecho = palitos[ind]
30 print 'Soy '+str(self.id)+' y agarre el palito derecho'
31 else: self.derecho = False
33 def agarrarPalitoIzquierdo(self):
34 semaforos[self.id].acquire()
35 self.izquierdo = palitos[self.id]
37 print 'Soy '+str(self.id)+' y agarre el palito izquierdo'
38 else: self.izquierdo = False
41 t = self.rnd.randint(1,5)
42 print 'Soy '+str(self.id)+' y voy a pensar durante '+str(t)+' segundos'
46 t = self.rnd.randint(1,5)
47 if self.derecho and self.izquierdo:
48 print 'Soy '+str(self.id)+' y voy a comer '+str(t)+' segundos'
49 self.comi = self.comi + 1
50 self.izquierdo = self.derecho = False
52 if self.id+1 == len(palitos): ind = 0
54 palitos[self.id] = True
56 semaforos[self.id].release()
57 semaforos[ind].release()
58 print 'Soy '+str(self.id)+' y solte los palitos'
63 if self.cant == self.comi: return True
67 time.sleep(self.rnd.randint(1,5))
68 while not self.lleno():
69 self.agarrarPalitoDerecho()
70 self.agarrarPalitoIzquierdo()
74 if __name__ == '__main__':
76 print "Modo de uso: "+ str(sys.argv[0]) + "<Cantidad de chinos invitados a la fiesta> <Cantidad de rondas que estara pensando o comiendo cada chino>"
80 for i in range(int(sys.argv[1])):
82 semaforos.append(threading.Semaphore(1))
83 chinos.append(filosofo(i,int(sys.argv[2])))