Sockets no bloqueantes

Joaquin Jose del Cerro Murciano jjdelcerromurciano en yahoo.es
Vie Jul 8 11:25:32 CEST 2005




>>
>
> 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. 

En sistemas unix, cuando as tenido que hacer un read sobre un dispositivo y 
ademas tenias que atender el UI, siempre han habido dos opciones, y las dos 
validas. 
- O bien tiras de fcntl y le cascas el flag de  O_NONBLOCK al dispositivo
- o tiras de select. 

Siempre has podido usar fcntls para montar sockets no bloqueantes, pero eso no 
era portable entre plataformas ya que M$ Windows no lo soportaba. Asi que han
dejado caer una capa sobre ello y nos han dado el metodo setblocking y 
settimeout para encubrir las diferencias entre los distintos operativos y que 
no tengas que lidiar con el siempre engorroso fcntl.

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.

Las diferencias en el codigo entre una opcion y otra para obtener los mismos 
resultados son cosmeticas. Valores de retorno frente a exceptiones y poco 
mas.

Al final de la jugada se trata de hacer pooling para ver si han llegado datos 
o si puedes escribir y si no continuar haciendo lo que tubieses que hacer. 
Pudes intentar leer y que te de una exception si no hay datos que leer 
(recv-non-blocking), o preguntar si hay datos antes de leer y si hay lees y 
si no no (select+recv-blocking). Usa la que mas te guste pero no digas que 
una sirbe y la otra no. Y lo mismo que es valido para el recv es valido para 
el send.

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.

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.

Un saludo
Joaquin.

		
______________________________________________ 
Renovamos el Correo Yahoo! 
Nuevos servicios, más seguridad 
http://correo.yahoo.es




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