Ver Mensaje Individual
  #6 (permalink)  
Antiguo 25/05/2015, 20:46
pabloryser
 
Fecha de Ingreso: mayo-2015
Mensajes: 15
Antigüedad: 9 años
Puntos: 0
Respuesta: Problema con hilos

AHORA SI RESUELTO, SINCRONIZADO Y FUNCIONANDO (por si sirve de ayuda a alguien)

Código Python:
Ver original
  1. #Este es el main
  2.  
  3. # Simular con hilos un sistema de reservación de vuelos. Las personas pueden consultar y reservar vuelos.
  4. # Hacer la sincronización con múltiples personas accediendo al registro de vuelos.
  5. # Cuando se reserva no se puede consultar y viceversa. Lanzar 20 hilos
  6. # 1000 lugares en el avion.
  7.  
  8. from Buffer import Vuelo
  9. from Ev_lector import Consulta
  10. from Ev_escritor import Reserva
  11.  
  12. cant_asi=20
  13. cant_consultas=5
  14. cant_reservas=5
  15. vuelo = Vuelo(cant_asi)            
  16. lector = Consulta("Consulta", vuelo, cant_consultas)
  17. escritor = Reserva("Reserva", vuelo, cant_reservas)
  18.  
  19. lector.start()
  20. escritor.start()
  21.  
  22. lector.join()
  23. escritor.join()
  24.  
  25. asi_oc=vuelo.get("MAIN")
  26. print("Lista final de asienos reservados:\n{0}".format(str(asi_oc)))

Código Python:
Ver original
  1. # "Ev_lector"
  2.  
  3. import threading
  4. import random
  5. import time
  6.  
  7. class Consulta(threading.Thread):
  8.    
  9.     def __init__(self, nombreHilo, asientos, cant):
  10.  
  11.         threading.Thread.__init__(self, name = nombreHilo)
  12.         self.cant=cant
  13.         self.asientos=asientos
  14.                
  15.     def run(self):
  16.                
  17.         for i in range(self.cant):
  18.             #time.sleep(random.randrange(5))
  19.             asi_oc=self.asientos.get(self.name)
  20.             print("El hilo {1} consulta la lista de asientos ocupados y es la siguiente: \n {0} \n".format(str(asi_oc), str(self.name)))

Código Python:
Ver original
  1. # "Ev_escritor"
  2.  
  3. import threading
  4. import random
  5. import time
  6.  
  7. class Reserva(threading.Thread):
  8.    
  9.     def __init__(self, nombreHilo, asientos, cant):
  10.  
  11.         threading.Thread.__init__(self, name=nombreHilo)
  12.         self.cant=cant
  13.         self.asientos=asientos
  14.        
  15.     def run(self):
  16.         #Reserva
  17.         for i in range(self.cant):
  18.             #time.sleep(random.randrange(5))
  19.             a=random.randint(1,self.asientos.get_cant())
  20.             while (self.asientos.vuelo.count(a)==0):
  21.                 a=random.randint(1,self.asientos.get_cant())
  22.             self.asientos.set(a, self.name)
  23.             print ("El hilo "+str(self.name)+" reserva el asiento "+ str(a))

Código Python:
Ver original
  1. # "Buffer"
  2.  
  3. import threading
  4. import time
  5. import random
  6.  
  7. class Vuelo:
  8.  
  9.     def __init__(self, cant):
  10.         self.vuelo = []
  11.         self.cant=cant
  12.         for v in range(1,self.cant+1):
  13.             self.vuelo.append(v)
  14.         #print(str(self.vuelo)) <--- Era para verificar el armado de la lista de asientos
  15.         self.ocup=[]
  16.         self.candado = threading.Lock()
  17.                    
  18.     def set(self, asiento, nombre):
  19.         self.candado.acquire()
  20.         print("-*"*25)
  21.         print("Toma control "+nombre)            #Para verificar que no se pise el hilo
  22.         time.sleep(random.randrange(5))
  23.         self.ocup.append(asiento)
  24.         self.vuelo.remove(asiento)
  25.         print("Suelta control "+nombre)
  26.         self.candado.release()
  27.        
  28.     def get(self, nombre):
  29.         self.candado.acquire()
  30.         print("-"*50)
  31.         print("Toma control "+nombre)            #Para verificar que no se pise el hilo
  32.         asi_oc=self.ocup
  33.         asi_oc.sort()
  34.         print("Suelta control "+nombre)
  35.         self.candado.release()
  36.         return asi_oc
  37.        
  38.     def get_cant(self):
  39.         par=self.cant
  40.         return par