Comunicación sin bloqueo y tiempos de espera¶
Por defecto, un socket
está configurado para que enviar o recibir bloques
de datos, deteniendo la ejecución del programa hasta que el conector esté listo.
Las llamadas a send()
esperan que el espacio del búfer esté disponible para
los datos salientes, y las llamadas a recv()
esperan que el otro programa
envíen datos que pueden leerse. Esta forma de operación de E/S es fácil de
entender, pero puede conducir a una operación ineficiente e incluso puntos
muertos, si ambos programas terminan esperando que el otro envíe o reciba
datos.
Hay algunas maneras de solucionar esta situación. Una es usar un hilo separado
para comunicarse con cada conector. Esto puede introducir otras complejidades,
sin embargo, con la comunicación entre los hilos. Otra opción es cambiar el
conector para que no se bloquee, y vuelva inmediatamente si no está listo para
manejar la operación. Usa el método setblocking()
para cambiar la marca de
bloqueo para un conector. El valor predeterminado es 1
, que significa
bloquear. Pasando un el valor de 0
desactiva el bloqueo. Si el conector
tiene el bloqueo apagado y no está listo para la operación, entonces se levanta
socket.error
.
Una solución de compromiso es establecer un valor de tiempo de espera para las
operaciones del conector. Usa settimeout()
para cambiar el tiempo de espera
de un socket
a un valor de punto flotante que representa el número de
segundos para bloquear antes de decidir que el conector no está listo para la
operación. Cuando el tiempo de espera expira, se genera una excepción
timeout
.