[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