Python: Socket sin locking o Asynchronos I / O

Soy nuevo en Python y actualmente tengo que escribir un socket de Python para ejecutarse como un script que se comunica con un dispositivo a través de TCP / IP (una estación meteorológica).
El dispositivo actúa como el lado del servidor (escucha a través de IP: PUERTO, acepta la conexión, recibe la solicitud, transfiere datos).
Solo necesito enviar un mensaje, recibir la respuesta y luego cerrar de forma pacífica y agradable el zócalo.

try: comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error, msg: sys.stderr.write("[ERROR] %s\n" % msg[1]) sys.exit(1) try: comSocket.connect(('')) except socket.error, msg: sys.stderr.write("[ERROR] %s\n" % msg[1]) sys.exit(2) comSocket.send('\r') comSocket.recv(128) comSocket.send('\r') comSocket.recv(128) comSocket.send('\r\r') comSocket.recv(128) comSocket.send('1I\r\r3I\r\r4I\r\r13I\r\r5I\r\r8I\r\r7I\r\r9I\r\r') rawData = comSocket.recv(512) comSocket.shutdown(1) comSocket.close() 

El problema que estoy teniendo es:
El canal de comunicación no es confiable, el dispositivo es lento. Entonces, a veces la respuesta del dispositivo con un mensaje de longitud 0 (solo un ACK), mi código se congelará y esperará la respuesta para siempre.
Este fragmento de código contiene la parte que involucra a SOCKET, todo el código se ejecutará bajo CRON, por lo que la congelación no es un comportamiento deseable.

Mi pregunta es:
Cuál sería la mejor manera en Python para manejar ese comportamiento, de modo que el código no se congele y espere eternamente, sino que intente pasar al siguiente envío (o algo así).

Puede probar un enfoque de tiempo de espera, como el código Russel o puede usar un zócalo sin locking, como se muestra en el código a continuación. Nunca se bloqueará en socket.recv y puede usarlo dentro de un bucle para reintentar tantas veces como desee. De esta manera su progtwig no se colgará en el tiempo de espera. De esta manera, puede probar si los datos están disponibles y, si no, puede hacer otras cosas y volver a intentarlo más tarde.

 socket.setblocking(0) while (retry_condition): try: data = socket.recv(512) except socket.error: '''no data yet..''' 

Yo recomendaría eventlet y hilos verdes para esto.

Twisted es una buena biblioteca pero una pequeña curva de aprendizaje para un caso de uso tan simple.

Echa un vistazo a algunos ejemplos aquí .

Intenta, antes de recibir, poner un timeout en el socket:

 comSocket.settimeout(5.0) try: rawData = comSocket.recv(512) except socket.timeout: print "No response from server"