[Python-es] problema con hilos

Chema Cortes pych3m4 en gmail.com
Lun Jul 2 13:50:35 CEST 2012


El día 2 de julio de 2012 04:05, jose villalba cortazzo
<josemariavillalbacortazzo en hotmail.com> escribió:
> Gente como puedo hacer para matar a los hilos socketudp y socketcp para que
> el programa se cierre solo y libere los recursos que esta utilizando.
> El programa es un cliente p2p que envía mensajes y transfiere archivos a
> otros clientes.
> Al arrancar el sistema hay que especificar el puerto por donde va a escuchar
> conexiones TCP y modificar la dirección de broadcast por la de su red para
> probarlo.
> Estoy estudiando socket.

Podías explicar un poco qué es lo que te pasa.

Por experiencia, supongo que los sockets no muestran los mensajes de
cierre y se te queda todo colgado. El hilo principal no puede terminar
porqué todavía tiene hijos en activo, y los hijos están bloqueados
porque el padre no suelta el control.

Soluciones:

1) haz que los hijos sean "daemons". De este modo, cuando el padre
termina, los hijos se interrumpen. El incoveniente es que los hijos no
acaban bien.

def __init__(self, puerto, cerrar):
        threading.Thread.__init__(self)
        self.daemon=True

2) Haz que el padre espere a que terminen los hijos.

    except KeyboardInterrupt:
        cola.put(salir)
        cerrar.put('OK')

        socketcp.join()
        socketudp.join()

        break

3) Cuando hay muchos hijos, resulta más práctico esperar a que los
queues se haya vaciado:

    except KeyboardInterrupt:
        cola.put(salir)
        cerrar.put('OK')

        cola.join()
        cerrar.join()

        break

Pero hace falta que en cada get tenga emparejado un task_done para
indicar que ha terminado el procesado del dato extraído:

        while True:
            salir = cola.get()
            ...
            cola.task_done()


Aunque no uses este método, haz siempre el task_done() al finalizar el
procesado.




-- 
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales


Más información sobre la lista de distribución Python-es