Problemas con socket, asyncore

David Villa dvilla en gmx.net
Mar Ago 9 11:55:07 CEST 2005


Hola:

La clase asyncore.dispatcher tiene un método "writable()". Cuando el
core ejecuta ese método, si devuelve True ejecuta "handle_write()". El
método heredado siempre devuelve True, por lo que tu objeto siempre está
listo para escribir, y siempre lo hace. Debes redefinir ese método y
devolver True sólo cuando tengas algo que enviar. Mira [1]

>>> import asyncore
>>> a = asyncore.dispacher()
>>> a.writable()
True

Saludos

[1] http://python.org/doc/2.3.3/lib/asyncore-example.html


El vie, 05-08-2005 a las 10:56 -0500, Hector Miuler Malpica Gallegos
escribió:
> Hola amigos, mi pequeño ejemplo con sockets consume mucho CPU (puede llegar 
> a 90%), son dos programas un server y un cliente.
> 
> EL SERVER
> =========
> #!/usr/bin/python
> 
> import asyncore, socket
> import psycopg, time, sys
> 
> 
> class MetrosHandle(asyncore.dispatcher):
> 
> def handle_write(self):
> print "handle_write"
> #self.send("OK")
> 
> def handle_read(self):
> print "handle_read"
> data_ = self.recv(256)
> print data_
> 
> def handle_close(self):
> print "handle_close"
> self.close()
> 
> 
> class ServerFlamingo(asyncore.dispatcher):
> 
> def __init__(self, port=1728):
> self.port = port
> self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
> self.bind(("", port))
> self.listen(5)
> print "listening on port", self.port
> 
> def handle_accept(self):
> channel, addr = self.accept()
> MetrosHandle(channel)
> 
> 
> server = ServerFlamingo(1728)
> asyncore.loop(1)
> 
> EL CLIENTE
> ==========
> ===
> #!/usr/bin/python
> 
> import socket
> 
> HOST="localhost"
> PORT=1728
> 
> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> s.connect((HOST, PORT))
> s.send('000 Hello, world 000 \n')
> s.send('111 Hello, world 111 \n')
> s.send('222 Hello, world 222 \n')
> s.send('333 Hello, world 333 \n')
> s.send('444 Hello, world 444 \n')
> #print s.recv(300)
> s.close()
> 
> Al ejecutarlo el cliente al parecer el server abre la conexión lee los datos 
> y entra en un casi eterno intento de escritura. Al quitar el comentario de 
> #self.send("OK") en el handle_write(self) del server y quitar el comentario 
> de #print s.recv(300) del cliente, recibo un monton de OK, porque este 
> intento de de escribir un monton de veces ?
> 
> 
> 
> 
> 




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