commit 724f56b7b84146be9e0c428443bc2e5bb1cc7dec Author: Nolete19 Date: Thu Dec 14 23:26:28 2023 +0100 Juanjo, he realizado dos versiones, una con una barra de progreso y otro directamente con los pasos realizados, el unico fallo es que a la hora de mostrarlo lo duplica todo el rato y no se como corregirlo... Toso el trabajo esta explicado en el interior con comentarios de manera ordenada y sencilla diff --git a/camellosBarras.py b/camellosBarras.py new file mode 100644 index 0000000..2317be4 --- /dev/null +++ b/camellosBarras.py @@ -0,0 +1,63 @@ +import time +import random +import threading +# Pasos totales de la carrera +pasos_finales = 1000 +# Caracteres que tiene que mostrar totales +barras_finales = 20 + +# Creamos la barrera para decir que hasta que no estén los 6 hilos la carrera no empieza. +barrera = threading.Barrier(6) + +# Creamos un candado para controlar el acceso a la hora de imprimir los resultados finales. +lock = threading.Lock() + +# Creamos un diccionario para almacenar los tiempos de cada camello. +tiempos = {} + +def inscribirse_carrera(i): + global pasos_finales + pasos_realizados = 0 # Pasos que ha realizado cada camello + barras_realizadas = 0 # Barras de progreso que se muestran + + print(f"El camello {i} se ha apuntado a la carrera") + + barrera.wait() # Hasta que no esten los 6 camellos no empiezan conjuntamente + + print(f"El camello {i} ha EMPEZADO") + + # Registramos el tiempo de inicio + inicio = time.time() + + while barras_finales > barras_realizadas: + pasos_realizados = andar(pasos_realizados) + barras_realizadas = pasos_realizados // 50 # Division, ya que 20 simbolos representan 1000 pasos totales + print(f"\rProgreso del camello {i}: {'#' * barras_realizadas}", end="\r", flush=True) + + # Registramos el tiempo cuando el camello finaliza la carrera + fin = time.time() + + # Guardamos el tiempo que tardó este camello + tiempos[i] = fin - inicio + + # Verificamos si todos los camellos han terminado + with lock: + if len(tiempos) == 6: #Si la longitud de tiempos es igual a 6 camellos imprime el resultado. + + # Imprimimos la clasificacion final junto con sus tiempos + print("==================================================") + print("| CLASIFICACION |") + print("==================================================") + # Iteramos sobre los items del diccionario de los tiempos de cada camello + for i, tiempo in tiempos.items(): + print(f"\nEl camello {i} ha FINALIZADO. Tiempo: {tiempo:.2f} segundos") + +def andar(pasos_realizados): + time.sleep(0.05) # Establecemos un pequeño retroceso al programa, para que no sea tan rapido + pasos_random = random.randint(1, 10) # Genaramos un numero aleatorio de pasos entre 1 y 10 + pasos_realizados = pasos_realizados + pasos_random + return pasos_realizados # Devolvemos los pasos realizados por cada camello + +for x in range(6): + t = threading.Thread(target=inscribirse_carrera, args=(x+1,)) # Creamos los hilos asignandole la funcion de inscribirse en la carrera + t.start() # Iniciamos todos los hilos diff --git a/camellosPasos.py b/camellosPasos.py new file mode 100644 index 0000000..b6f1549 --- /dev/null +++ b/camellosPasos.py @@ -0,0 +1,59 @@ +import time +import random +import threading +# Pasos totales de la carrera +pasos_finales = 1000 + +# Creamos la barrera para decir que hasta que no estén los 6 hilos la carrera no empieza. +barrera = threading.Barrier(6) + + +# Creamos un candado para controlar el acceso a la hora de imprimir los resultados finales. +lock = threading.Lock() + +# Creamos un diccionario para almacenar los tiempos de cada camello +tiempos = {} + +def inscribirse_carrera(i): + global pasos_finales + pasos_realizados = 0 # Pasos que ha realizado cada camello + + print(f"El camello {i} se ha apuntado a la carrera") + barrera.wait() # Hasta que no esten los 6 camellos no empiezan conjuntamente + + print(f"El camello {i} ha EMPEZADO") + + # Registramos el tiempo de inicio + inicio = time.time() + + while pasos_finales > pasos_realizados: + pasos_realizados = andar(pasos_realizados) + print(f"\rProgreso del camello {i}: {pasos_realizados}", end="\r", flush=True) + + # Registramos el tiempo de finalización + fin = time.time() + + # Guardamos el tiempo que tardó este camello + tiempos[i] = fin - inicio + + # Verificamos si todos los camellos han terminado + with lock: + if len(tiempos) == 6: #Si la longitud de tiempos es igual a 6 camellos imprime el resultado. + + # Imprimimos la clasificacion final junto con sus tiempos + print("==================================================") + print("| CLASIFICACION |") + print("==================================================") + # Iteramos sobre los items del diccionario de los tiempos de cada camello + for i, tiempo in tiempos.items(): + print(f"El camello {i} ha FINALIZADO. Tiempo: {tiempo:.2f} segundos") + +def andar(pasos_realizados): + time.sleep(0.05) # Establecemos un pequeño retroceso al programa, para que no sea tan rapido + pasos_random = random.randint(1, 10) # Genaramos un numero aleatorio de pasos entre 1 y 10 + pasos_realizados = pasos_realizados + pasos_random + return pasos_realizados # Devolvemos los pasos realizados por cada camello + +for x in range(6): + t = threading.Thread(target=inscribirse_carrera, args=(x+1,)) # Creamos los hilos asignandole la funcion de inscribirse en la carrera + t.start() # Iniciamos todos los hilos