[Python-es] problema con hilos

jose villalba cortazzo josemariavillalbacortazzo en hotmail.com
Lun Jul 2 22:07:38 CEST 2012


Tus consejos me han servido.
Lo que estoy programando en un cliente p2p y estaba teniendo problema para cerrar totalmente el programa al ingresar Ctrl  + C.
El funcionamiento es el siguiente:
Al ingresar el operador tiene que ingresar el puerto por donde va escuchar al resto de los clientes.
Para mandar un mensaje a un x cliente tiene que ingresar la IP del destinatario + espacio+ mensaje
Para mandar un mensajes a todos los clientes p2p de la red tiene que ingresar * + espacio+ mensaje.
Para mandar un archivo a un x cliente IP del destinatario+espacio+ &file+ruta donde se encuentra el archivo, el receptor almacena el archivo en su directorio de trabajo actual.
Para mandar un archivo a todos los clientes de la red *+espacio+&file+ruta donde se encuentra el archivo.
Adjunto el trabajo final para ver si alguien le puede realizar alguna mejora, una de las mejoras que le tengo que realizar es que al arrancar el programa tome automáticamente la dirección de broadcast de la red donde se esta ejecutando.
Saludos,
José.

> Date: Mon, 2 Jul 2012 13:50:35 +0200
> Froim: pych3m4 en gmail.com
> To: python-es en python.org
> Subject: Re: [Python-es] problema con hilos
> 
> 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
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
 		 	   		  
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20120702/d28a2472/attachment.html>


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