]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blob - src/filosofos_bis.py
Pongo la espera en segundos para ser consistente.
[z.facultad/75.59/filosofos.git] / src / filosofos_bis.py
1 #! /usr/bin/env python2.4
2 import threading
3 import sys
4 import random
5 import time
6 from sync import *
7
8 palitos = [] #vector con los palitos
9
10 class palito:
11         def __init__(self, id):
12                 self.id = id
13                 self.libre = True
14         
15         @synchronized('dejar')
16         def dejar(self):
17                 self.libre = True
18         
19         @synchronized('libre')
20         def free(self):
21                 return self.libre
22
23         @synchronized('tomar')
24         def tomar(self):
25                 self.libre = False
26
27
28 class filosofo(threading.Thread):
29         def __init__(self, izq, der, cant):
30                 threading.Thread.__init__(self)
31                 self.id = self.izq = izq
32                 self.der = der
33                 self.izq = izq
34                 self.rnd = random.Random()
35                 self.cant = cant # cantidad de veces que va a comer
36                 self.comi = 0 # cantidad de veces que comio
37                 self.derecha = False # indica si tengo el palito derecho
38                 self.izquierda = False # indica si tengo el palito izquierdo
39                 self.start()
40
41         def pensar(self):
42                 t = self.rnd.randint(1,5)
43                 print 'Soy '+str(self.id)+' y voy a pensar durante '+str(t)+' segundos'
44                 time.sleep(t)
45
46         def comer(self):
47                 t = self.rnd.randint(1,5)
48                 print 'Soy '+str(self.id)+' y voy a comer durante '+str(t)+' segundos'
49                 self.comi = self.comi + 1
50                 time.sleep(t)
51         
52         def lleno(self):
53                 if self.cant == self.comi:
54                         return True
55                 else: return False
56
57         def run(self):
58                 while not self.lleno():
59                         self.pensar()
60                         if palitos[self.der].free():
61                                 palitos[self.der].tomar()
62                                 self.derecha = True
63                                 print 'Soy '+str(self.id)+' y tome el palito derecho'
64                                 if palitos[self.izq].free():
65                                         palitos[self.izq].tomar()
66                                         self.izquierda = True
67                                         print 'Soy '+str(self.id)+' y tome el palito izquierdo'
68                                 else:
69                                         palitos[self.der].dejar()
70                                         self.derecha = self.izquierda = False
71                                         print 'Soy '+str(self.id)+' y deje el palito derecho'
72                         if self.derecha and self.izquierda:
73                                 self.comer()
74                                 palitos[self.der].dejar()
75                                 palitos[self.izq].dejar()
76                                 self.derecha = self.izquierda = False
77                                 print 'Soy '+str(self.id)+' y deje los palitos'
78                         else: self.pensar()
79                         
80 if __name__ == '__main__':
81         if len(sys.argv) < 3:
82                 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>"
83                 sys.exit()
84                 
85         chinos = []
86         for i in range(int(sys.argv[1])):
87                 palitos.append(palito(i))
88                 chinos.append(filosofo(i,(i+1)%int(sys.argv[1]),int(sys.argv[2])))
89
90                                 
91