]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blob - src/filosofos.py
27c969063941b4030ab443ec80ae3e3e0275abf3
[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
12
13 class filosofo(threading.Thread):
14         def __init__(self, numeracion, cant):
15                 threading.Thread.__init__(self)
16                 self.id = numeracion
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
20                 self.derecho = False
21                 self.izquierdo = False
22                 self.start()
23         
24         @synchronized('Lock')
25         def agarrarPalitoDerecho(self):
26                 if self.id+1 == len(palitos): ind = 0
27                 else: ind = self.id+1
28                 self.derecho = palitos[ind]
29                 if self.derecho:
30                         print 'Soy '+str(self.id)+' y agarre el palito derecho'
31                 else: self.derecho = False
32                 
33         @synchronized('Lock')
34         def agarrarPalitoIzquierdo(self):
35                 self.izquierdo = palitos[self.id]
36                 if self.izquierdo:
37                         print 'Soy '+str(self.id)+' y agarre el palito izquierdo'
38                 else: self.izquierdo = False
39
40         def pensar(self):
41                 t = self.rnd.randint(0,5)
42                 print 'Soy '+str(self.id)+' y voy a pensar durante '+str(t)+' segundos'
43                 time.sleep(t)
44
45         def comer(self):
46                 if self.derecho and self.izquierdo:
47                         print 'Soy '+str(self.id)+' y voy a comer'
48                         self.comi = self.comi + 1
49                         self.izquierdo = self.derecho = False
50                         time.sleep(self.rnd.randint(0,5))
51                         if self.id+1 == len(palitos): ind = 0
52                         else: ind = self.id+1
53                         palitos[self.id] = True
54                         palitos[ind] = True
55                         'Soy '+str(self.id)+' y solte los palitos'
56                         return True
57                 else: return False
58                 
59         def lleno(self):
60                 if self.cant == self.comi: return True
61                 else: return False
62                 
63         def run(self):
64                 while not self.lleno():
65                         self.agarrarPalitoDerecho()
66                         self.agarrarPalitoIzquierdo()
67                         if not self.comer():
68                                 self.pensar()
69                         else: time.sleep(5) #comiendo
70
71 if __name__ == '__main__':
72         if len(sys.argv) < 3:
73                 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>"
74                 exit
75         
76         chinos = []
77         for i in range(int(sys.argv[1])):
78                 palitos.append(True)
79                 chinos.append(filosofo(i,int(sys.argv[2])))
80