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