Hilos en python algo que no entiendo

Iniciado por eliander20, 20 Mayo 2017, 23:47 PM

0 Miembros y 1 Visitante están viendo este tema.

eliander20

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:
Código (python) [Seleccionar]
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!

Eleкtro

#1
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!








tincopasan

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.
Código (python) [Seleccionar]

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()