我的应用程序存在一个问题,即如果它失去连接,它将永远阻塞,整个应用程序需要重新启动。
有问题的代码:
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()调用上。
所以我的问题是,如何检测连接何时丢失并重新连接?