У моего приложения есть проблема, из-за которой, если оно теряет соединение, оно блокируется навсегда и необходимо перезапустить все приложение.
Код, о котором идет речь:
def run(encoder, port, channel):
decoder_socket = socket.socket()
decoder_socket.connect((decoder, port))
decoder_fp = decoder_socket.makefile("r", 0)
parser = xml.sax.make_parser(['xml.sax.IncrementalParser'])
parser.setContentHandler(RftDecoder())
while True:
data = decoder_fp.readline().strip("\x00")
if not(data):
raise socket.error("no data")
LOG.info("%s" % data.strip())
parser.feed(data)
Если соединениеактивно закрыты с другой стороны, исключение возбуждается, как и ожидалось, проблем нет.Однако, когда соединение обрывается (например, если Decoder падает, или если кабель отключен), тогда вызов decoder_fp.readline () блокируется на неопределенный срок.
Strace ничего не показывает, когда это происходит, он просто продолжает сидеть в вызове recv ().
Итак, мой вопрос, как я могу обнаружить потерянное соединение, как описано,и переподключиться?