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