Hola tengo un problema con los threads o hilos en python, y es que no se, si es que no entiendo bien de que se trata o si mi codigo esta mal.
El problema viene en lo siguiente y es que he estado viendo codigo fuente de programas que tienen daemons osea la funcion set.Daemon(True), bien entiendo que esto es para darle un valor true para cuando cerremos el programa el proceso se cierre correctamente, pero si no es daemon el proceso se queda o no se cierra correctamente.
Bien eso lo entiendo pero hago un codigo de esta manera:
import threading
def hola():
while True:
print "Hola!"
def adios():
while True:
print "Adios!"
t = threading.Thread(target=hola)
t.setDaemon(True)
t.start()
t2 = threading.Thread(target=adios)
t2.setDaemon(True)
t2.start()
Bien pero mi duda radica en lo siguiente tengo dos hilos pero si se fijan cada funcion target de cada hilo tiene un while True, pero entonces a la hora de ejecutar el script solo ejecuta una vez Hola Hola Hola varias veces y Adios Adios Adios varias veces dejango una salida mas o menos asi
Hola!
Hola!
Hola!
Hola!
Hola!
Hola!
Hola!
Hola!
Adios!
Adios!
Adios!
Adios!
Adios!
Adios!
Adios!
Y se cierra solo, osea el script se detiene solo y no se siguen ejecutando los hilos o Threads y a veces solo hace una salida asi solo con "Hola!"
Hola!
Hola!
Hola!
Hola!
Hola!
Hola!
Cita de: eliander20 en 20 Mayo 2017, 23:47 PMset.Daemon(True), bien entiendo que esto es para darle un valor true para cuando cerremos el programa el proceso se cierre correctamente, pero si no es daemon el proceso se queda o no se cierra correctamente.
No. No parece ser exactamente eso.
Cita de: https://docs.python.org/2/library/threading.htmlA thread can be flagged as a "daemon thread". The significance of this flag is that the entire Python program exits when only daemon threads are left. The initial value is inherited from the creating thread. The flag can be set through the daemon property.
Como ahí indican, marcar un thread con el flag "daemon" (
Thread.setDaemon(True) ) sirve para volver el thread a un estado no bloqueante, y así permitir que la ejecución de la aplicación termine, aunque el thread esté activo. Por ende, si solo tienes threads "daemónicos" activos en tu código, entonces la ejecución de los threads será "abortada" para finalizar la ejecución al llegar a la última instrucción de tu código.
Cita de: eliander20 en 20 Mayo 2017, 23:47 PMBien pero mi duda radica en lo siguiente tengo dos hilos pero si se fijan cada funcion target de cada hilo tiene un while True, pero entonces a la hora de ejecutar el script solo ejecuta una vez Hola Hola Hola varias veces y Adios Adios Adios varias veces dejango una salida mas o menos asi
En teoría el
while no importa en este caso puesto que solo tienes threads "daemónicos", por ende no se vuelven "búcles infinitos"; sino que al llegar a la última instrucción de tu programa, se aborta la ejecución de los threads "daemónicos", y por consiguiente, la aplicación termina su ejecución. Si tuvieras un thread adicional normal y corriente, entonces los dos threads "daemónicos" de tu código no se detendrían.
Cita de: eliander20 en 20 Mayo 2017, 23:47 PMel script se detiene solo y no se siguen ejecutando los hilos o Threads
Precisamente por eso, por que son "daemonic" threads. Arriba en la cita de la documentación oficial de
Python explican el por qué sucede ese comportamiento, aparte de lo que yo he intentado explicar de forma adicional.
En fin. No sé si me he explicado de la mejor forma ya que no uso mucho
Python, pero, ¿has entendido cual es el origen del problema?.
PD: No sé si en Español se les llamará hilos "
daemónicos", como ya digo no uso mucho
Python, simplemente me pareció una buena traducción literal del Inglés.
¡Saludos!
no entiendo bien que quieres hacer , pero una de las cosas, supongo es que quieres imprimir indefinidamente dos mensajes(hola y adios) y de forma alternada, te muestro una posible forma de hacerlo.Con respecto a daemon, no sé que crees o esperas que haga.
import threading
import time
def saludo(mensaje):
while True:
print (mensaje)
time.sleep(1)
def main():
mensaje="Hola"
mensaje1="Adios"
t = threading.Thread(target=saludo,args=(mensaje,))
t1 = threading.Thread(target=saludo,args=(mensaje1,))
t.start()
t1.start()
y=input("Presione Enter para terminar...")
main()