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.