Python TCP/IP通信脚本提前终止问题排查与解决
Python TCP通信脚本递归转循环解决提前终止问题
我有一个基于TCP/IP协议与其他软件通信的Python脚本,负责接收XML格式数据,原本运行正常。但将模块打包安装到项目环境后,脚本出现无提示的提前终止,且终止发生在to_line递归函数执行过程中(打印消息行时会中途停止)。
递归实现代码:
def to_line(self, message: RecievedMessage): sys.setrecursionlimit(10**6) if len(self.data[0]) > 0: size = ord(self.data[0]) line = "".join(self.data[4:size + 4]).strip() # print(line) message.recieved_lines.append(RecievedMessage.RecievedLine(size=size, data=line)) del self.data[0: size + 4] self.to_line(message) else: return message
我已排查递归限制过低等常见问题(已设置递归深度为10^6),但未发现异常。随后将to_line方法改为循环实现:
循环实现代码:
def to_line(self) -> None: while len(self.data[0]) > 0: size = ord(self.data[0]) line = "".join(self.data[4:size + 4]).strip() self.message.recieved_lines.append(RecievedMessage.RecievedLine(size=size, data=line)) del self.data[0: size + 4]
修改后成功解决了脚本提前终止的问题。
问题原因分析
Python递归即使手动设置了较高的递归深度限制,在打包后的模块运行环境中,可能受到解释器实际栈空间、模块加载上下文的限制,导致未达到设置的递归深度就触发静默栈溢出终止。而循环实现不存在栈累积的问题,更适合这种需要持续解析数据流的场景。
内容的提问来源于stack exchange,提问作者Dorus
相关产品推荐
相关产品推荐

