1) El documento explica qué son los hilos o threads en .NET y cómo se usan para ejecutar código de forma concurrente. 2) Un ejemplo común es un servidor web, que crea un nuevo hilo para cada solicitud HTTP mientras el hilo principal continúa escuchando nuevas solicitudes. 3) La clase Thread de .NET permite crear e iniciar nuevos hilos, así como controlar su ejecución a través de métodos como Start, Join y Suspend.
Un hilo es una tarea que puede ejecutarse simultáneamente con otras tareas. Los hilos comparten recursos como memoria y archivos con otros hilos dentro de un mismo proceso, pero cada hilo tiene su propio contador de programa y estado de CPU. Los hilos pueden cambiar entre estados como ejecución, listo y bloqueado.
Este documento presenta información sobre procesos y threads. Explica que los procesos son programas en ejecución identificados por un PID, mientras que los threads son unidades mínimas de trabajo que comparten el espacio de direcciones de un proceso. También describe herramientas para la sincronización de threads como mutexes y semáforos, e indica que el módulo threading de Python soporta la programación concurrente mediante threads mientras que multiprocessing permite la ejecución de procesos en paralelo.
El documento describe dos formas comunes de crear hilos en Python: pasando una función al constructor de Thread o creando una subclase de Thread que reescribe el método run(). También presenta ejemplos de cómo crear hilos que llaman a una función contadora y cómo asignarles nombres y obtener sus identificadores. Explica cómo crear hilos con argumentos y hilos que funcionan durante un tiempo determinado, así como el uso de hilos demonio para que el programa principal pueda terminar aunque otros hilos aún no hayan completado.
El documento trata sobre hilos (threads) en Java. Explica que un hilo es un flujo de ejecución independiente que puede ejecutarse en paralelo a otros. Detalla la clase Thread de Java y cómo crear e implementar hilos heredando de Thread o implementando la interfaz Runnable. También cubre conceptos como el ciclo de vida de los hilos y la sincronización.
Este documento resume la Unidad IV de programación concurrente (multihilo). Explica conceptos clave como hilos, estados de hilos, programas de flujo único, creación y control de hilos, y sincronización de hilos a través del uso de métodos synchronized y declaraciones synchronized.
La clase Timer se utiliza para crear hilos basados en planificación. Se pueden programar tareas usando la clase TimerTask, la cual extiende la clase Runnable. Las tareas se pueden programar para ejecutarse una sola vez o repetidamente cada cierto periodo de tiempo. El ejemplo muestra cómo programar una tarea para forzar la recolección de basura cada 5 segundos usando las clases Timer y TimerTask.
La clase Thread permite crear hilos de ejecución concurrentes en Java. Para crear un hilo, una clase debe extender Thread y redefinir el método run(), el cual especifica la tarea concurrente. Se inicia un hilo mediante el método start(), el cual invoca a run() y devuelve el control. Los hilos comparten los recursos de un proceso y pasan por diferentes estados como nuevo, ejecutable y muerto.
1) El documento explica qué son los hilos o threads en .NET y cómo se usan para ejecutar código de forma concurrente. 2) Un ejemplo común es un servidor web, que crea un nuevo hilo para cada solicitud HTTP mientras el hilo principal continúa escuchando nuevas solicitudes. 3) La clase Thread de .NET permite crear e iniciar nuevos hilos, así como controlar su ejecución a través de métodos como Start, Join y Suspend.
Un hilo es una tarea que puede ejecutarse simultáneamente con otras tareas. Los hilos comparten recursos como memoria y archivos con otros hilos dentro de un mismo proceso, pero cada hilo tiene su propio contador de programa y estado de CPU. Los hilos pueden cambiar entre estados como ejecución, listo y bloqueado.
Este documento presenta información sobre procesos y threads. Explica que los procesos son programas en ejecución identificados por un PID, mientras que los threads son unidades mínimas de trabajo que comparten el espacio de direcciones de un proceso. También describe herramientas para la sincronización de threads como mutexes y semáforos, e indica que el módulo threading de Python soporta la programación concurrente mediante threads mientras que multiprocessing permite la ejecución de procesos en paralelo.
El documento describe dos formas comunes de crear hilos en Python: pasando una función al constructor de Thread o creando una subclase de Thread que reescribe el método run(). También presenta ejemplos de cómo crear hilos que llaman a una función contadora y cómo asignarles nombres y obtener sus identificadores. Explica cómo crear hilos con argumentos y hilos que funcionan durante un tiempo determinado, así como el uso de hilos demonio para que el programa principal pueda terminar aunque otros hilos aún no hayan completado.
El documento trata sobre hilos (threads) en Java. Explica que un hilo es un flujo de ejecución independiente que puede ejecutarse en paralelo a otros. Detalla la clase Thread de Java y cómo crear e implementar hilos heredando de Thread o implementando la interfaz Runnable. También cubre conceptos como el ciclo de vida de los hilos y la sincronización.
Este documento resume la Unidad IV de programación concurrente (multihilo). Explica conceptos clave como hilos, estados de hilos, programas de flujo único, creación y control de hilos, y sincronización de hilos a través del uso de métodos synchronized y declaraciones synchronized.
La clase Timer se utiliza para crear hilos basados en planificación. Se pueden programar tareas usando la clase TimerTask, la cual extiende la clase Runnable. Las tareas se pueden programar para ejecutarse una sola vez o repetidamente cada cierto periodo de tiempo. El ejemplo muestra cómo programar una tarea para forzar la recolección de basura cada 5 segundos usando las clases Timer y TimerTask.
La clase Thread permite crear hilos de ejecución concurrentes en Java. Para crear un hilo, una clase debe extender Thread y redefinir el método run(), el cual especifica la tarea concurrente. Se inicia un hilo mediante el método start(), el cual invoca a run() y devuelve el control. Los hilos comparten los recursos de un proceso y pasan por diferentes estados como nuevo, ejecutable y muerto.
Este material didáctico fue desarrollado para la asignatura de Tópicos Avanzados de Programación, del plan SCD-1027 2016 de Ing. En Sistemas Computacionales
Este documento proporciona una introducción a las principales APIs de procesamiento XML en Java, incluyendo JAXP, DOM, SAX, StAX y JAXB. Explica sus características, casos de uso y cómo funcionan para leer, escribir y transformar documentos XML. También compara las ventajas e inconvenientes de cada API.
1) Los sistemas operativos modernos tratan las unidades de recursos (procesos) e unidades de despacho (hilos) de forma independiente, donde los procesos son unidades de recursos y los hilos son unidades de despacho.
2) Los procesos son pesados y comparten recursos, mientras que los hilos son livianos, existen varios por proceso, y comparten los recursos del proceso.
3) Los hilos comparten el código, datos y recursos de un proceso, y son baratos de crear y gestionar en comparación con los pro
Este documento presenta conceptos sobre programación concurrente y hilos. Explica que un hilo es un proceso que se ejecuta en el sistema operativo y que permiten dividir tareas complejas en subtareas concurrentes. Describe métodos para crear, detener y sincronizar hilos. Finalmente, presenta el problema clásico de los filósofos comensales como ejemplo de uso de recursos compartidos y sincronización entre hilos.
Slides de la novena clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. Thread y Runnable
2. Planificación
3. Sincronización
Este documento presenta información sobre programación concurrente utilizando hilos. Explica conceptos como hilos, clases Thread y Monitor, y métodos para la sincronización de hilos como lock, wait y pulse. También presenta ejemplos de código para crear y manejar hilos, y describe problemas como el problema de los filósofos comensales que requieren sincronización de hilos.
La creación de hilos permite que un proceso genere subprocesos o hilos para realizar tareas de forma concurrente. El bloqueo de hilos los pone en espera hasta que ocurra un evento, y el desbloqueo los coloca listos para volver a ejecutarse. La terminación de un hilo libera sus recursos, y la aplicación multihilo permite cambiar entre hilos para aprovechar mejor los recursos del sistema.
El documento describe conceptos relacionados con hilos en Java, incluyendo la definición de un hilo, su ciclo de vida, y técnicas como la interrupción y bloqueo. También cubre el uso de interfaces Runnable y métodos como sleep para gestionar la ejecución concurrente de hilos.
Este documento presenta una serie de prácticas para familiarizarse con los lenguajes HTML, JavaScript y Java. La Práctica 1 introduce conceptos básicos de HTML como la estructura, tags y listas. La Práctica 2 añade formularios a una página web existente. La Práctica 3 explica funcionalidades de JavaScript como la validación de formularios. Finalmente, la Práctica 4 y 5 presentan conceptos básicos de programación en Java como bucles, métodos, componentes gráficos y applets.
Este documento describe los hilos en Java. Los puntos principales son:
1) Un hilo es un proceso en ejecución dentro de un programa Java.
2) Los hilos implementan prioridad y mecanismos de sincronización como wait() y notify().
3) Cualquier clase se puede convertir en un hilo implementando la interfaz Runnable.
El documento describe las diferencias entre procesos y hilos en la programación concurrente. Un proceso tiene sus propios recursos privados como memoria, mientras que los hilos comparten los recursos de un proceso. En Java, la programación concurrente se basa principalmente en hilos. La clase Thread permite crear nuevos hilos que ejecutan el método run() de forma concurrente al hilo principal. También es posible implementar la interfaz Runnable para crear hilos sin heredar de Thread.
1) El documento describe la creación y gestión de procesos e hilos en Linux. Incluye ejemplos de cómo crear procesos con fork() y hilos con pthread_create(), y cómo comunicarlos y sincronizarlos con wait(), exit(), join() y otras funciones.
2) También explica conceptos básicos como los identificadores de proceso (pid), la estructura jerárquica de procesos, y cómo los procesos e hilos comparten y gestionan la memoria de forma independiente.
3) Finalmente, propone actividades prácticas
Este módulo cubre los hilos en Java, los cuales permiten que un programa realice múltiples tareas al mismo tiempo. Se explica cómo crear hilos, controlar su ejecución y proteger los datos compartidos. Se definen los hilos, sus estados de ciclo de vida y métodos como wait(), notify() y synchronized. También se describen formas comunes de crear hilos como implementando Runnable o extendiendo Thread.
El documento describe los conceptos de threads y programación multithread en Java. Específicamente, explica que (1) los threads comparten recursos y permiten la ejecución concurrente de tareas, a diferencia de los procesos que son independientes, y (2) Java permite la creación explícita de threads para lograr mayor flexibilidad y rendimiento en aplicaciones.
Un thread es un proceso ligero o tarea que se ejecuta dentro de un programa. Pueden existir múltiples threads ejecutándose simultáneamente. Los threads comparten los recursos del programa y cada uno tiene un flujo secuencial de control. Existen dos métodos para crear threads en Java: extendiendo la clase Thread e implementando la interfaz Runnable.
Un thread es un proceso ligero o tarea que se ejecuta dentro de un programa. Pueden existir múltiples threads ejecutándose simultáneamente. Los threads comparten los recursos del programa y cada uno tiene un flujo secuencial de control. Existen dos métodos para crear threads en Java: extendiendo la clase Thread e implementando la interfaz Runnable.
El documento explica los conceptos básicos de la programación orientada a objetos en C++. Define clases, objetos, métodos públicos y privados. Explica el uso de constructores y destructores para inicializar y liberar recursos de objetos. También cubre temas como E/S con flujos, manejo de archivos y constructores parametrizados.
Este documento explica los conceptos básicos de la programación orientada a objetos en C++. Define clases, objetos, constructores, destructores y funciones miembro. También cubre sobrecarga de operadores, funciones amigas y constructores de copia. El documento proporciona ejemplos para ilustrar cómo se implementan estos conceptos en C++.
Este documento describe los conceptos básicos de la programación orientada a objetos en C++. Explica las clases, objetos, constructores, destructores, sobrecarga de operadores, funciones amigas y constructores de copia. También cubre temas como el manejo de ficheros, formatos de entrada y salida, y constructores parametrizados.
Más contenido relacionado
Similar a Material-Lab-2-Trabajo-con-hilos.docx.............
Este material didáctico fue desarrollado para la asignatura de Tópicos Avanzados de Programación, del plan SCD-1027 2016 de Ing. En Sistemas Computacionales
Este documento proporciona una introducción a las principales APIs de procesamiento XML en Java, incluyendo JAXP, DOM, SAX, StAX y JAXB. Explica sus características, casos de uso y cómo funcionan para leer, escribir y transformar documentos XML. También compara las ventajas e inconvenientes de cada API.
1) Los sistemas operativos modernos tratan las unidades de recursos (procesos) e unidades de despacho (hilos) de forma independiente, donde los procesos son unidades de recursos y los hilos son unidades de despacho.
2) Los procesos son pesados y comparten recursos, mientras que los hilos son livianos, existen varios por proceso, y comparten los recursos del proceso.
3) Los hilos comparten el código, datos y recursos de un proceso, y son baratos de crear y gestionar en comparación con los pro
Este documento presenta conceptos sobre programación concurrente y hilos. Explica que un hilo es un proceso que se ejecuta en el sistema operativo y que permiten dividir tareas complejas en subtareas concurrentes. Describe métodos para crear, detener y sincronizar hilos. Finalmente, presenta el problema clásico de los filósofos comensales como ejemplo de uso de recursos compartidos y sincronización entre hilos.
Slides de la novena clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. Thread y Runnable
2. Planificación
3. Sincronización
Este documento presenta información sobre programación concurrente utilizando hilos. Explica conceptos como hilos, clases Thread y Monitor, y métodos para la sincronización de hilos como lock, wait y pulse. También presenta ejemplos de código para crear y manejar hilos, y describe problemas como el problema de los filósofos comensales que requieren sincronización de hilos.
La creación de hilos permite que un proceso genere subprocesos o hilos para realizar tareas de forma concurrente. El bloqueo de hilos los pone en espera hasta que ocurra un evento, y el desbloqueo los coloca listos para volver a ejecutarse. La terminación de un hilo libera sus recursos, y la aplicación multihilo permite cambiar entre hilos para aprovechar mejor los recursos del sistema.
El documento describe conceptos relacionados con hilos en Java, incluyendo la definición de un hilo, su ciclo de vida, y técnicas como la interrupción y bloqueo. También cubre el uso de interfaces Runnable y métodos como sleep para gestionar la ejecución concurrente de hilos.
Este documento presenta una serie de prácticas para familiarizarse con los lenguajes HTML, JavaScript y Java. La Práctica 1 introduce conceptos básicos de HTML como la estructura, tags y listas. La Práctica 2 añade formularios a una página web existente. La Práctica 3 explica funcionalidades de JavaScript como la validación de formularios. Finalmente, la Práctica 4 y 5 presentan conceptos básicos de programación en Java como bucles, métodos, componentes gráficos y applets.
Este documento describe los hilos en Java. Los puntos principales son:
1) Un hilo es un proceso en ejecución dentro de un programa Java.
2) Los hilos implementan prioridad y mecanismos de sincronización como wait() y notify().
3) Cualquier clase se puede convertir en un hilo implementando la interfaz Runnable.
El documento describe las diferencias entre procesos y hilos en la programación concurrente. Un proceso tiene sus propios recursos privados como memoria, mientras que los hilos comparten los recursos de un proceso. En Java, la programación concurrente se basa principalmente en hilos. La clase Thread permite crear nuevos hilos que ejecutan el método run() de forma concurrente al hilo principal. También es posible implementar la interfaz Runnable para crear hilos sin heredar de Thread.
1) El documento describe la creación y gestión de procesos e hilos en Linux. Incluye ejemplos de cómo crear procesos con fork() y hilos con pthread_create(), y cómo comunicarlos y sincronizarlos con wait(), exit(), join() y otras funciones.
2) También explica conceptos básicos como los identificadores de proceso (pid), la estructura jerárquica de procesos, y cómo los procesos e hilos comparten y gestionan la memoria de forma independiente.
3) Finalmente, propone actividades prácticas
Este módulo cubre los hilos en Java, los cuales permiten que un programa realice múltiples tareas al mismo tiempo. Se explica cómo crear hilos, controlar su ejecución y proteger los datos compartidos. Se definen los hilos, sus estados de ciclo de vida y métodos como wait(), notify() y synchronized. También se describen formas comunes de crear hilos como implementando Runnable o extendiendo Thread.
El documento describe los conceptos de threads y programación multithread en Java. Específicamente, explica que (1) los threads comparten recursos y permiten la ejecución concurrente de tareas, a diferencia de los procesos que son independientes, y (2) Java permite la creación explícita de threads para lograr mayor flexibilidad y rendimiento en aplicaciones.
Un thread es un proceso ligero o tarea que se ejecuta dentro de un programa. Pueden existir múltiples threads ejecutándose simultáneamente. Los threads comparten los recursos del programa y cada uno tiene un flujo secuencial de control. Existen dos métodos para crear threads en Java: extendiendo la clase Thread e implementando la interfaz Runnable.
Un thread es un proceso ligero o tarea que se ejecuta dentro de un programa. Pueden existir múltiples threads ejecutándose simultáneamente. Los threads comparten los recursos del programa y cada uno tiene un flujo secuencial de control. Existen dos métodos para crear threads en Java: extendiendo la clase Thread e implementando la interfaz Runnable.
El documento explica los conceptos básicos de la programación orientada a objetos en C++. Define clases, objetos, métodos públicos y privados. Explica el uso de constructores y destructores para inicializar y liberar recursos de objetos. También cubre temas como E/S con flujos, manejo de archivos y constructores parametrizados.
Este documento explica los conceptos básicos de la programación orientada a objetos en C++. Define clases, objetos, constructores, destructores y funciones miembro. También cubre sobrecarga de operadores, funciones amigas y constructores de copia. El documento proporciona ejemplos para ilustrar cómo se implementan estos conceptos en C++.
Este documento describe los conceptos básicos de la programación orientada a objetos en C++. Explica las clases, objetos, constructores, destructores, sobrecarga de operadores, funciones amigas y constructores de copia. También cubre temas como el manejo de ficheros, formatos de entrada y salida, y constructores parametrizados.
Similar a Material-Lab-2-Trabajo-con-hilos.docx............. (20)
1. Laboratorio 3
Sistemas Operativos III (SO-III)
Módulo II: Comunicación entre procesos en SOD
Introducción
2.1 Comunicación entre procesos
2.2 Comunicación de procesos a través de Paso de mensajes
Actividades:
Explique el funcionamiento de los siguientes códigos cuatro codigos:
uso-hilos.py
threading: Módulo que permite trabajar con hilos.
time: Módulo para manejar operaciones de tiempo (como pausas).
datetime: Módulo para manejar fechas y horas.
logging: Módulo para generar logs (aunque no se utiliza en el código mostrado).
Definición de funciones:
2. consultar(id_persona): Simula una operación de consulta que toma 2 segundos en completarse.
guardar(id_persona, data): Simula una operación de guardar datos que toma 5 segundos en completarse.
Inicio del tiempo:
tiempo_ini = datetime.datetime.now()
Captura el tiempo inicial antes de iniciar los hilos.
Creación y ejecución de hilos:
t1 y t2 son hilos creados con el módulo threading.
t1 ejecutará la función consultar con el argumento 1.
t2 ejecutará la función guardar con los argumentos 1 y "Aprendiendo el uso de hilos".
t1.start() y t2.start() inician la ejecución de los hilos.
Esperar a que los hilos terminen:
t1.join() y t2.join() aseguran que el programa espere hasta que ambos hilos terminen su ejecución antes de continuar.
Fin del tiempo:
tiempo_fin = datetime.datetime.now()
Captura el tiempo final después de que los hilos han terminado.
Cálculo del tiempo transcurrido:
print("tiempo transcurrido " + str(tiempo_fin.second - tiempo_ini.second))
Calcula y muestra el tiempo transcurrido en segundos entre el inicio y el fin de la ejecución de los hilos.
Explicación adicional
El propósito del código es demostrar cómo se pueden ejecutar dos funciones (en este caso, consultar y guardar) en paralelo
utilizando hilos.
3. uso-hilos2.py
Explicación del código secuencial
Importaciones:
import threading
import time
import datetime
import logging
Estas importaciones se mantienen igual y son necesarias para el uso de hilos y manejo de tiempo, aunque en este ejemplo
específico no se están utilizando los hilos.
Definición de funciones:
Las funciones consultar y guardar son las mismas que en el ejemplo anterior. Simulan operaciones que tardan 2 segundos y 5
segundos respectivamente.
Inicio del tiempo:
tiempo_ini = datetime.datetime.now()
Captura el tiempo inicial antes de ejecutar las funciones.
4. Ejecución de funciones de manera secuencial:
# t1 = threading.Thread(name="hilo_1", target=consultar, args=(1, ))
# t2 = threading.Thread(name="hilo_2", target=guardar, args=(1, "Aprendiendo el uso de hilos"))
# t1.start()
# t2.start()
consultar(1)
guardar(1, "Aprendiendo el uso de hilos")
En lugar de crear y empezar los hilos t1 y t2, las funciones consultar y guardar se ejecutan secuencialmente. Esto significa que
consultar se ejecutará primero y, una vez finalizada, se ejecutará guardar.
Fin del tiempo:
tiempo_fin = datetime.datetime.now()
Captura el tiempo final después de que ambas funciones han terminado de ejecutarse.
Cálculo del tiempo transcurrido:
print("tiempo transcurrido " + str(tiempo_fin.second - tiempo_ini.second))
Calcula y muestra el tiempo transcurrido en segundos entre el inicio y el fin de la ejecución de las funciones.
5. uso-hilos3.py
Explicación del código con hilos
Importaciones:
import threading
import time
import datetime
import logging
Las importaciones son necesarias para manejar hilos y tiempo en Python. Aunque logging no se usa en el código mostrado, se
mantiene por si se requiere para futuros registros de logs
Definición de funciones:
def consultar(id_persona):
time.sleep(2)
def guardar(id_persona, data):
time.sleep(5)
6. consultar(id_persona): Simula una operación de consulta que toma 2 segundos.
guardar(id_persona, data): Simula una operación de guardar datos que toma 5 segundos.
Inicio del tiempo:
tiempo_ini = datetime.datetime.now()
Captura el tiempo inicial antes de iniciar los hilos.
Creación y ejecución de hilos:
t1 y t2 son hilos creados con el módulo threading.
t1 ejecutará la función consultar con el argumento 1.
t2 ejecutará la función guardar con los argumentos 1 y "Aprendiendo el uso de hilos".
t1.start() y t2.start() inician la ejecución de los hilos.
Esperar a que los hilos terminen:
t1.join()
t2.join()
t1.join() y t2.join() aseguran que el programa principal espere hasta que ambos hilos terminen su ejecución antes de
continuar. Esto es crucial para medir el tiempo transcurrido correctamente.
Fin del tiempo:
tiempo_fin = datetime.datetime.now()
Captura el tiempo final después de que los hilos han terminado.
Cálculo del tiempo transcurrido:
print("tiempo transcurrido " + str(tiempo_fin.second - tiempo_ini.second))
Calcula y muestra el tiempo transcurrido en segundos entre el inicio y el fin de la ejecución de los hilos.
uso-hilos3.py demuestra cómo usar hilos para ejecutar tareas en paralelo y esperar a que terminen, lo que puede mejorar
significativamente el rendimiento en comparación con la ejecución secuencial de las tareas.
7. uso-hilos4.py
Explicación del Código
Importación de Módulos:
import threading
import time
import datetime
import logging
threading: Para trabajar con hilos.
time: Para funciones relacionadas con el tiempo, como sleep.
datetime: Para trabajar con fechas y horas.
logging: Para registrar mensajes de log, útil para depuración.
Configuración del Logging:
logging.basicConfig(level=logging.DEBUG, format='[%(levelname)s] (%(threadName)-s) %(message)s')
8. Configura el módulo de logging para que muestre mensajes de nivel DEBUG o superior. El formato especifica cómo se
verán los mensajes de log, incluyendo el nivel de log, el nombre del hilo y el mensaje.
Definición de la función consultar:
def consultar(id_persona):
logging.info("Consultando para el id " + str(id_persona))
time.sleep(2)
return
Esta función simula una consulta para un id_persona. Registra un mensaje informativo y luego duerme el hilo durante 2
segundos.
Definición de la función guardar:
def guardar(id_persona, data):
logging.info("Consultando para el id " + str(id_persona) + " data " + data)
time.sleep(5)
return
Esta función simula el guardado de datos para un id_persona con la información data. Registra un mensaje informativo y
luego duerme el hilo durante 5 segundos.
Registro del tiempo inicial:
tiempo_ini = datetime.datetime.now()
Guarda el tiempo actual antes de iniciar los hilos.
Creación de Hilos:
t1 = threading.Thread(name="hilo_1", target=consultar, args=(1,))
t2 = threading.Thread(name="hilo_2", target=guardar, args=(1, "Aprendiendo el uso de hilos"))
t1: Crea un hilo llamado hilo_1 que ejecutará la función consultar con el argumento 1.
t2: Crea un hilo llamado hilo_2 que ejecutará la función guardar con los argumentos 1 y "Aprendiendo el uso de hilos".
Inicio de los Hilos:
t1.start()
t2.start()
Inicia la ejecución de los hilos t1 y t2.
9. Esperar a que los Hilos Terminen:
t1.join()
t2.join()
Bloquea la ejecución principal hasta que los hilos t1 y t2 hayan terminado.
Registro del tiempo final:
tiempo_fin = datetime.datetime.now()
Guarda el tiempo actual después de que los hilos hayan terminado.
Cálculo y impresión del tiempo transcurrido:
print("tiempo transcurrido " + str(tiempo_fin.second - tiempo_ini.second))
Calcula y muestra el tiempo transcurrido en segundos. Esta forma de calcular el tiempo puede ser imprecisa si la ejecución cruza
un cambio de minuto.