Sockets no bloqueantes

David Villa dvilla en gmx.net
Vie Jul 8 08:00:59 CEST 2005


Hola:

En realidad un socket bloqueante/no-bloqueante no es un nuevo tipo de
socket, es más bien un modo. 

Cuando usas un socket bloqueante, al hacer una llamada a recv() el
proceso queda bloqueado hasta que llegan datos. Es algo parecido a leer
del teclado (que también puede ser bloqueante o no).

Eso está muy bien cuando sólo manejas un dispositivo asíncrono (y un
socket lo es). El problema se puede resolver de varias maneras, por
ejemplo con hilos o con el select(). 

select() permite manejar en un solo punto varios descriptores
asíncronos, de modo que cuando lees o escribes en un dispositivo (lo que
incluye a los sockets) ya sabes de antemano que hay algo para leer o
escribir (según sea) de modo que evitas que te bloquee el proceso.

Llegados a este punto y dicho lo dicho, no entiendo porqué Darío
necesita sockets no-bloqueantes. Si usas select() no hay mucha
diferencia entre usar bloqueantes o no. Y puestos a elegir, son
preferibles los bloqueantes.

Saludos


El jue, 07-07-2005 a las 12:14 -0300, jmoroz en uol.com.ar escribió:
> [Puede parecer OFF-TOPIC pero el tema ya esta instalado]
> 
> Pero entonces cuantos tipo de sockets hay, yo conozco los
> inet y los de unix(filesystem).
> Mejor dicho, se ve que de los inet hay varios tipos!?
> Podrias hacer una vreve reseña de lo que implica ser
> bloqueante y no bloqueante.
> Recuerdo haber jugado con sockets en VB pero no infirio
> en el aplicativo si eran o no bloqueantes.
> 
> desde ya garcias
> Mario.
> 
> 
> Darío López Llueca escribió:
> > Gracias Joaquín José pero ese problema ya lo tenía resuelto, simplemente
> > usando sockets no bloqueantes :) (ya que ese es el principal beneficio
> > de estos sobre los bloqueantes).
> > 
> > Aps... y gracias a Francesc también, por sus orientaciones :)
> > 
> > Joaquin Jose del Cerro Murciano wrote:
> > 
> > 
> >>Hola otra vez, 
> >>En el ejemplo que te deje ayer mejor una correccion, no esperar a que el 
> >>socket este listo para escribir si lo que quieres es leer. Osea
> >>
> >> 
> >>
> >>
> >>>print "Esperando a recibir respuesta"
> >>>read = []
> >>>while s not in read:
> >>> read, write, error = select.select ([s],[s],[s],1)
> >>>   
> >>>
> >>
> >>     read, write, error = select.select ([s],[],[s],1)
> >> 
> >>
> >>
> >>> print read, write, error
> >>>
> >>>print 'Se ha recibido algo!'
> >>>   
> >>>
> >>
> >>Un saludo
> >>Joaquin.
> >>
> >>		
> >>______________________________________________ 
> >>Renovamos el Correo Yahoo! 
> >>Nuevos servicios, más seguridad 
> >>http://correo.yahoo.es
> >>_______________________________________________
> >>Python-es mailing list
> >>Python-es en aditel.org
> >>http://listas.aditel.org/listinfo/python-es
> >> 
> >>
> > 
> > 
> > _______________________________________________
> > Python-es mailing list
> > Python-es en aditel.org
> > http://listas.aditel.org/listinfo/python-es
> > 
> > 
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
> 




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