]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blob - src/filosofos2.py
me copio de gaz
[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 class filosofo(threading.Thread):
13         def __init__(self, izq, der, cant):
14                 threading.Thread.__init__(self)
15                 self.id = izq
16                 self.rnd = random.Random()
17                 self.cant = cant # cantidad de veces que va a comer
18                 self.comi = 0 # cantidad de veces que comio
19                 self.der = der
20                 self.izq = izq
21                 self.ambos = [False, False]
22                 self.start()
23         
24         def agarrarPalitoDerecho(self):
25                 semaforos[self.der].acquire()
26                 palitos[self.der] = False
27                 self.ambos[1] = True
28                 print 'Soy '+str(self.id)+' y agarre el palito derecho'
29                 
30         def agarrarPalitoIzquierdo(self):
31                 semaforos[self.izq].acquire()
32                 palitos[self.izq] = False
33                 self.ambos[0] = True
34                 print 'Soy '+str(self.id)+' y agarre el palito izquierdo'
35
36         def dejarPalitoDerecho(self):
37                 palitos[self.der] = True
38                 semaforos[self.der].release()
39                 self.ambos[1] = False
40                 print 'Soy '+str(self.id)+' y solte el palito derecho'
41
42         def dejarPalitoIzquierdo(self):
43                 palitos[self.izq] = True
44                 semaforos[self.izq].release()
45                 self.ambos[0] = False
46                 print 'Soy '+str(self.id)+' y solte el palito izquierdo'
47
48         def pensar(self):
49                 t = self.rnd.randint(2,5)
50                 print 'Soy '+str(self.id)+' y voy a pensar durante '+str(t)+' segundos'
51                 time.sleep(t)
52
53         def comer(self):
54                 t = self.rnd.randint(1,5)
55                 if self.ambos == [True, True]:
56                         print 'Soy '+str(self.id)+' y voy a comer '+str(t)+' segundos' 
57                         self.comi = self.comi + 1
58                         self.izquierdo = self.derecho = False
59                         time.sleep(t)
60
61                         self.dejarPalitoIzquierdo()
62                         self.dejarPalitoDerecho()
63                         
64                         return True
65                 else: return False
66                 
67         def lleno(self):
68                 if self.cant == self.comi: return True
69                 else: return False
70                 
71         def run(self):
72                 while not self.lleno():
73                         self.pensar()
74                         self.agarrarPalitoDerecho()
75                         self.agarrarPalitoIzquierdo()
76                         self.comer()
77
78 #               while not self.lleno():
79 #                       self.agarrarPalitoDerecho()
80 #                       self.agarrarPalitoIzquierdo()
81 #                       if not self.comer():
82 #                               self.pensar()
83
84 if __name__ == '__main__':
85         if len(sys.argv) < 3:
86                 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>"
87                 sys.exit()
88         if int(sys.argv[1]) <= 1:
89                 print "Debe haber por lo menos 2 chinos"
90                 sys.exit()
91         
92         chinos = []
93         todos = int(sys.argv[1]);
94         for i in range(todos):
95                 palitos.append(True)
96                 semaforos.append(threading.Semaphore(1))
97                 chinos.append(filosofo(i,(i+1)%todos,int(sys.argv[2])))