]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blob - src/filosofos2.py
todo
[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                 
33         def agarrarPalitoIzquierdo(self):
34                 semaforos[self.id].acquire()
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(1,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                 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
51                         time.sleep(t)
52                         if self.id+1 == len(palitos): ind = 0
53                         else: ind = self.id+1
54                         palitos[self.id] = True
55                         palitos[ind] = True
56                         semaforos[self.id].release()
57                         semaforos[ind].release()
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
74 if __name__ == '__main__':
75         if len(sys.argv) < 3:
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>"
77                 sys.exit()
78         
79         chinos = []
80         for i in range(int(sys.argv[1])):
81                 palitos.append(True)
82                 semaforos.append(threading.Semaphore(1))
83                 chinos.append(filosofo(i,int(sys.argv[2])))
84