Sockets no bloqueantes

David Villa dvilla en gmx.net
Vie Jul 8 16:51:40 CEST 2005


Hola:


El vie, 08-07-2005 a las 11:25 +0200, Joaquin Jose del Cerro Murciano
escribió:
> 
> 
> >>
> >
> > Uso los no bloqueantes porque a parte de las conexiones, voy a hacer uso
> > de una interfaz gráfica, y si hiciera uso de los sockets bloqueantes,
> > cuando pidiese o enviase cosas por el socket, la interfaz se quedaría
> > bloqueada (y la verdad, a mí no me gusta eso :)). También existe la
> > posibilida de los hilos, pero entonces entraríamos en el tema de los
> > semáforos y complicaría sobre manera mi programa.
> > 
> > Espero que ahora ya entendáis un poco mis razones :P:P
> > 
> > 
> 
> El tema de los socket bloqueantes o no-bloqueantes es algo asi como un 
> artificio de python para mantener compatibilidad entre plataformas. 

Hombre, no es sólo una cuestión de python, en muchos lenguajes hay
primitivas bloqueantes/no-bloqueantes para acceder a dispositivos
asíncronos (sean sockets o lo que sean).


> Con las dos formas tienes funcionalidades similares y usar una u otra es 
> cuestion de gustos. Decir que una no es buena en detrimento de la otra sin 
> aportar ningun fundamento, lo unico que hace es liar a los mas novatos en 
> python.

Creo que la cuestión no es si "es mejor". Sí que es una cuestión de
gustos. A mi me parece más cómodo usar sockets bloqueantes, creo que es
más fácil localizar puntos de fallo y es más fácil pensar en términos
"bloqueantes" (sobre todo para un novato).

Pero vamos, que no dudo de la utilidad de los no-bloqueantes, es
evidente que Darío los prefiere. Yo creo que el tema de la UI no es un
problema insalvable que impida usar bloqueantes, pero vamos, cada uno
decide lo que le parece mejor.


> Ademas si solo estas usando un socket, el modo non-blocking puede parecer 
> comodo, pero como tengas que estar pendiente de 5 o 6, o incluso mas sockets, 
> el metodo del select casi seguro que te va a quitar muchos dolores de cabeza 
> ya que le dices que te informe si se puede leer o escribir de una lista de 
> sockets.

A pesar de lo que decías antes, está claro que tú también tienes tus
preferencias :-D  En realidad no hay nada que te impida usar el mismo
select() con sockets no-bloqueantes y es igual de bueno. Está claro que
con los bloqueantes al menos te ahorras el setsockopt() :-)

A fin de cuentas este problema está más que estudiado y todos nos
topamos de vez en cuando con él. La solución es el patrón "reactor".
Twisted tiene implementaciones muy monas de "reactors" que permiten
ejecutar el bucle de eventos de un GUI y a la vez tener una serie de
entradas asíncronas, al estilo de g_main_loop() y los "io_channels" de
glib. No sé si pygtk trae las io_channels, me da que no. A veces echo en
falta en python algunas cosas de glib, aunque siempre hay otra manera de
hacerlo.


> Son validas las dos opciones y segun que escenario te sera mas comodo usar una 
> u otra. Deja que cada cual decida y no vallas creando prejuicios frente una u 
> otra opcion entre los usuarios de la lista.

Esto no sé si lo dices por Darío o por mi. No me ha parecido que la
intención de Darío fuese crear prejuicios y desde luego no es la mía.
Yo aconsejo los bloqueantes porque por mi experiencia creo que dan menos
problemas, pero ni mucho menos he dicho que esté mal usar
no-bloqueantes. 

Creo que no es nada malo que cada uno dé su opinión y se contrasten
experiencias. Creo que eso de que "cada cual decida" no encaja con la
idea de una lista (opinión personal). Yo pregunto en la lista porque me
fío de la experiencia de los demás, y un buen consejo a tiempo me puede
ahorrar muchos dolores de cabeza.

Saludos




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