abrir socket dentro de un thread

punchik punchik punchikk en yahoo.com
Dom Jun 8 01:10:57 CEST 2008


hola Javi y  lista. gracias por la respuesta , hace dias que estoy volviendome loco con esto de los threads, te cuento que ya consegui enviar datos al servidor desde el thread en forma de loop. Bueno conseguir hacer esto ,pero mi aplicacion se traba mientras va enviando los datos y ni siquiera carga la parte grafica de la aplicacion.

este es el codigo que correji:

class MiThread(threading.Thread):
    def __init__(self, num):
       
        threading.Thread.__init__(self)
        self.num = num
        self.params = urllib.urlencode({'data': 3453, 'equis': 3123, 'ygri': 12444})
        self.headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
        self.conn = httplib.HTTPConnection("www.ketaplex.net")    
        self.apid = select_access_point()
        self.apo = access_point(self.apid)
        #myip= self.apo.ip()
    def envia(self):
         self.conn.request("POST", "/cgi-bin/grow_recibe.py", self.params, self.headers)
         self.response = self.conn.getresponse()        
                   
       
    def run(self):
        set_default_access_point(self.apo)
        self.s = socket(AF_INET, SOCK_STREAM)
        while running == 1:
               self.envia()


misteriosamente si pongo los comandos set_default_access_point(self.apo) y  self.s = socket(AF_INET, SOCK_STREAM) fuera dela funcion run , el programa me pide por un access point cada vez que llama la funcion envia. No se a que se debe esto... bueno la cosa es que ahora al ejecutar el programa ese si puee enviar los datos desde el nuevo thread que he creado , pero mientras esto sucede la otra parte de mi aplicacion se bloquea. Es como si el codigo se quedase en el loop del thread y no siguiese ejecutando los otros comandos. Alguien tiene alguna idea de porque es esto? o como solucionarlo?
javi porque dices que en mi caso seria mejor usar eventos?  es twisted una libreria? hay algun tutorial para novatos?

sobre tu pregunta Javi estoy tratando de envia informacion todo el rato porque la idea es hacer un juego multiusuario , lo que envio  son los datos gps de cada jugador que necesito enviar al servidor y necesito hacerlo constantemente. tu crees que necesito n preguntar si hay cosas que enviar, esto optimizaria mi programa?
muchas gracias

oyuky


--- On Sat, 6/7/08, lasizoillo <lasizoillo en gmail.com> wrote:

> From: lasizoillo <lasizoillo en gmail.com>
> Subject: Re: [Python-es] abrir socket dentro de un thread
> To: "Lista de discusión sobre python en castellano" <python-es en aditel.org>
> Date: Saturday, June 7, 2008, 3:14 PM
> Buenas:
> 
> El día 6 de junio de 2008 1:49, punchik punchik
> <punchikk en yahoo.com> escribió:
> > hola amigos, tengo dos preguntas relacionados a
> threads. la primera es:
> > necesito enviar datos a un servidor constantemente,
> para esto estoy usando la libreria httplib. Lo primero que
> intente es enviar  los datos desde el loop princial del mi
> programa, el problema con esto es que la funcion request,
> espera hasta que se conecte y luego necesita recibir una
> respuesta, por lo que si pongo esto en el loop principal mi
> aplicacion termina por hacerse muy lenta, es por lo cual me
> recomendaron usar un thread para enviar los datos al
> servidor.l
> 
> Veo tres opciones posibles:
> - Procesos.
> - Hilos
> - Eventos. Por ejemplo twisted. Yo suelo tirar más por
> este lado.
> 
> >
> > Estoy tratando de abrir un socket desde un thread de
> la siguiente manera:
> >
> > class MiThread(threading.Thread):
> >     def __init__(self, num):
> >         apid = select_access_point()
> >         apo = access_point(apid)
> >         set_default_access_point(apo)
> >         s = socket(AF_INET, SOCK_STREAM)
> >         myip= apo.ip()
> >         params = urllib.urlencode({'data':
> myip, 'equis': 3123, 'ygri': 12444})
> >         headers = {"Content-type":
> "application/x-www-form-urlencoded",
> "Accept": "text/plain"}
> >         conn =
> httplib.HTTPConnection("www.ketaplex.net")
> >         threading.Thread.__init__(self)
> >         self.num = num
> >     def run(self):
> >          conn.request("POST",
> "/cgi-bin/grow_recibe.py", params, headers)
> >          response = conn.getresponse()
> >
> 
> No entiendo por qué veo tan poco "self" en tu
> código. ¿Usas variables
> globales en vez de atributos de la clase?
> 
> >
> > mi thread lo inicializo de la siguiente manera
> >
> > t = MiThread(1)
> > t.start()
> > t.join()
> >
> > bueno el problema es que no funciona no se porque,
> cuando ejecuto el codigo desde fuera del thread si envia el
> mensaje al servidor, pero cuando lo pongo dentro del thread
> no funciona. Algujien tiene idea de que estroy haciendo
> mal?
> >
> 
> ¿Desde fuera del hilo tambien lo haces usando orientacion
> a objetos?
> 
> >
> >
> >
> > la segunda pregunta que tenia es como puedo hacer para
> ejecutar la funcion run en forma de loop. osea cuando
> termine de enviar al servidor , vuelva  a iniciar el ciclo
> y envie de nuevo.
> 
> Una aproximación un poco guarra:
> 
> while True:
>     self.hacer_lo_que_sea()
> 
> Lo que no entiendo es que quieras enviar cosas todo el rato
> y no
> necesites preguntar si hay cosas que enviar. Pero bueno, en
> eso no me
> voy a meter.
> 
> Un saludo:
> 
> Javi
> _______________________________________________
> Lista de correo Python-es
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes


      
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





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