AHORA SI RESUELTO, SINCRONIZADO Y FUNCIONANDO (por si sirve de ayuda a alguien)
Código Python:
Ver original#Este es el main
# Simular con hilos un sistema de reservación de vuelos. Las personas pueden consultar y reservar vuelos.
# Hacer la sincronización con múltiples personas accediendo al registro de vuelos.
# Cuando se reserva no se puede consultar y viceversa. Lanzar 20 hilos
# 1000 lugares en el avion.
from Buffer import Vuelo
from Ev_lector import Consulta
from Ev_escritor import Reserva
cant_asi=20
cant_consultas=5
cant_reservas=5
vuelo = Vuelo(cant_asi)
lector = Consulta("Consulta", vuelo, cant_consultas)
escritor = Reserva("Reserva", vuelo, cant_reservas)
lector.start()
escritor.start()
lector.join()
escritor.join()
asi_oc=vuelo.get("MAIN")
print("Lista final de asienos reservados:\n{0}".format(str(asi_oc)))
Código Python:
Ver original# "Ev_lector"
import threading
import random
import time
class Consulta(threading.Thread):
def __init__(self, nombreHilo, asientos, cant):
threading.Thread.__init__(self, name = nombreHilo)
self.cant=cant
self.asientos=asientos
def run(self):
for i in range(self.cant):
#time.sleep(random.randrange(5))
asi_oc=self.asientos.get(self.name)
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# "Ev_escritor"
import threading
import random
import time
class Reserva(threading.Thread):
def __init__(self, nombreHilo, asientos, cant):
threading.Thread.__init__(self, name=nombreHilo)
self.cant=cant
self.asientos=asientos
def run(self):
#Reserva
for i in range(self.cant):
#time.sleep(random.randrange(5))
a=random.randint(1,self.asientos.get_cant())
while (self.asientos.vuelo.count(a)==0):
a=random.randint(1,self.asientos.get_cant())
self.asientos.set(a, self.name)
print ("El hilo "+str(self.name)+" reserva el asiento "+ str(a))
Código Python:
Ver original# "Buffer"
import threading
import time
import random
class Vuelo:
def __init__(self, cant):
self.vuelo = []
self.cant=cant
for v in range(1,self.cant+1):
self.vuelo.append(v)
#print(str(self.vuelo)) <--- Era para verificar el armado de la lista de asientos
self.ocup=[]
self.candado = threading.Lock()
def set(self, asiento, nombre):
self.candado.acquire()
print("-*"*25)
print("Toma control "+nombre) #Para verificar que no se pise el hilo
time.sleep(random.randrange(5))
self.ocup.append(asiento)
self.vuelo.remove(asiento)
print("Suelta control "+nombre)
self.candado.release()
def get(self, nombre):
self.candado.acquire()
print("-"*50)
print("Toma control "+nombre) #Para verificar que no se pise el hilo
asi_oc=self.ocup
asi_oc.sort()
print("Suelta control "+nombre)
self.candado.release()
return asi_oc
def get_cant(self):
par=self.cant
return par