Python: неблокирующий сокет или асинхронный ввод-вывод

Я новичок в Python и в настоящее время должен написать сокет python, который будет запускаться как сценарий, который взаимодействует с устройством через TCP / IP (метеостанция).
Устройство действует как сторона сервера (прослушивание через IP: ПОРТ, прием соединения, получение запроса, передача данных).
Мне нужно всего лишь отправить одно сообщение, получить ответ, а затем спокойно и красиво выключить и закрыть сокет.

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()

У меня проблема:
Канал связи ненадежный, устройство работает медленно. Итак, иногда ответ устройства с сообщением длины 0 (просто ACK), мой код зависает и ждет ответа вечно.
Этот фрагмент кода содержит часть, которая включает в себя SOCKET, весь код будет выполняться под CRON, поэтому замораживание нежелательно.

Мой вопрос:
Каким будет лучший способ в Python справиться с таким поведением, чтобы код не зависал и не ждал вечно, а пытался перейти к следующей отправке (или тому подобному).

10
задан pradyunsg 18 February 2013 в 15:02
поделиться