[Python-es] problema con hilos

jose villalba cortazzo josemariavillalbacortazzo en hotmail.com
Lun Jul 2 23:17:05 CEST 2012


Ejemplo de ejecución:
*********************************************************************************
jose en pepe:/media/DATOS/usuario/Mis Documentos Usuario/p2p$ python p2p.py
9000
10.168.1.110 &file /home/jose/prueba.txt
[2012.07.02 18:10] 10.168.1.110 &file prueba.txt
* hola
[2012.07.02 18:10] 10.168.1.110 hola
* &file /home/jose/prueba.txt
[2012.07.02 18:10] 10.168.1.110 &file prueba.txt
10.168.1.110 quien sos?
[2012.07.02 18:11] 10.168.1.110 quien sos?
python
Error al enviar el mensaje.
10.168.1.113 estas?
Destinatario no conectado
10.1.134.5 prueba
#se cuelga y reacciona al rato.
 Destinatario no conectado
**********************************************************************
Tengo un solo erro pero funciona bien, el erro es que cuando intento conectarme a un cliente que no pertenece a mi subred el sistema queda colgado por un tiempo importante hasta que reacciona indicándome que el receptor no existe.
Adjunto el código.
Saludos.
From: josemariavillalbacortazzo en hotmail.com
To: py en ch3m4.org; python-es en python.org
Date: Mon, 2 Jul 2012 20:07:38 +0000
Subject: Re: [Python-es] problema con hilos





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/
 		 	   		  

_______________________________________________
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/45538153/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: p2p.py
Type: text/x-python
Size: 8360 bytes
Desc: no disponible
URL: <http://mail.python.org/pipermail/python-es/attachments/20120702/45538153/attachment.py>


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