]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blob - src/filosofos.py
Pongo la espera en segundos para ser consistente.
[z.facultad/75.59/filosofos.git] / src / filosofos.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
9 palitos = []
10 semaforos = []
11 todoscomieron = 0
12 class monitor(threading.Thread):
13         def __init__(self, cant):
14                 threading.Thread.__init__(self)
15                 self.cant = cant
16                 self.start()
17
18         def run(self):
19                 global todoscomieron
20                 while todoscomieron < self.cant:
21                         print 'palitos = ', palitos
22                         time.sleep(1)
23
24 class filosofo(threading.Thread):
25         def __init__(self, izq, der, cant):
26                 threading.Thread.__init__(self)
27                 self.id = self.izq = izq
28                 self.der = der
29                 self.rnd = random.Random()
30                 self.cant = cant # cantidad de veces que va a comer
31                 self.comi = 0 # cantidad de veces que comio
32                 self.derecho = False
33                 self.izquierdo = False
34                 self.start()
35         
36         @synchronized('LockTomarDerecho')
37         def agarrarPalitoDerecho(self):
38                 self.derecho = palitos[self.der]
39                 if self.derecho:
40                         palitos[self.der] = False
41                         print 'Soy '+str(self.id)+' y agarre el palito derecho'
42                         return True
43                 else:
44                         self.derecho = False
45                         palitos[self.der] = True
46                         return False
47
48         @synchronized('LockSoltarDerecho')
49         def dejarPalitoDerecho(self):
50                 self.derecho = False
51                 palitos[self.der] = True
52                 print 'Soy '+str(self.id)+' y solte el palito derecho'
53         
54         @synchronized('LockIzquierdo')
55         def agarrarPalitoIzquierdo(self):
56                 self.izquierdo = palitos[self.izq]
57                 if self.izquierdo:
58                         palitos[self.izq] = False
59                         print 'Soy '+str(self.id)+' y agarre el palito izquierdo'
60                         return True
61                 else:
62                         self.izquierdo = False
63                         palitos[self.izq] = True
64                         return False
65
66         def pensar(self):
67                 t = self.rnd.randint(1,5)
68                 print 'Soy '+str(self.id)+' y voy a pensar durante '+str(t)+' segundos'
69                 time.sleep(t)
70
71         def comer(self):
72                 if self.derecho and self.izquierdo:
73                         t = self.rnd.randint(1,5)
74                         print 'Soy '+str(self.id)+' y voy a comer durante '+str(t)+' segundos'
75                         self.comi = self.comi + 1
76                         time.sleep(t)
77                         self.derecho = self.izquierdo = False
78                         palitos[self.izq] = True
79                         palitos[self.der] = True
80                         print 'Soy '+str(self.id)+' y solte los palitos'
81                 
82         def lleno(self):
83                 global todoscomieron
84                 if self.cant == self.comi:
85                         todoscomieron = todoscomieron + 1
86                         return True
87                 else: return False
88                 
89         def run(self):
90                 while not self.lleno():
91                         self.pensar()
92                         if self.agarrarPalitoDerecho():
93                                 self.agarrarPalitoIzquierdo()
94                         else:
95                                 self.dejarPalitoDerecho()
96                         self.comer()
97                         
98 if __name__ == '__main__':
99         if len(sys.argv) < 3:
100                 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>"
101                 sys.exit()
102                 
103 #       mo = monitor(int(sys.argv[1]))
104         chinos = []
105         for i in range(int(sys.argv[1])):
106                 palitos.append(True)
107                 chinos.append(filosofo(i,(i+1)%int(sys.argv[1]),int(sys.argv[2])))
108