Python win32控制台程序可能会挂起,具体取决于内存使用情况

Python win32控制台程序可能会挂起,具体取决于内存使用情况,python,memory,console,Python,Memory,Console,我遇到了一个Python例程的问题,该例程创建链接对象的数据结构,然后挂起,有时甚至永远挂起 如果我创建小型数据结构(例如,用于测试代码),则不会出现问题。然而,较大的结构可能导致它们悬挂 我在win32控制台中运行了各种大小的脚本,它们要么挂起一分钟左右,要么无限期挂起,具体取决于创建的数据结构的大小。使用Windows任务管理器,与挂起一段时间然后完成的脚本相关联的内存约为25 M字节,而永久挂起的脚本约为50 M字节 键入CTRL-C立即终止挂起的脚本。脚本实际上已经完成了所有指令的执行,

我遇到了一个Python例程的问题,该例程创建链接对象的数据结构,然后挂起,有时甚至永远挂起

如果我创建小型数据结构(例如,用于测试代码),则不会出现问题。然而,较大的结构可能导致它们悬挂

我在win32控制台中运行了各种大小的脚本,它们要么挂起一分钟左右,要么无限期挂起,具体取决于创建的数据结构的大小。使用Windows任务管理器,与挂起一段时间然后完成的脚本相关联的内存约为25 M字节,而永久挂起的脚本约为50 M字节

键入CTRL-C立即终止挂起的脚本。脚本实际上已经完成了所有指令的执行,即在控制台上看到了末尾的print语句,但它们只是挂起

有人能建议如何调试这个问题吗


这显然与数据的大小和数量有关,因为数据越多,Python挂起(即返回)所需的时间就越长。所以,我想这与记忆有关。但是它实际上并没有导致错误:如果数据结构变得太大,Python就无法释放内存。

您能展示关于数据结构的更多细节/代码吗?将有助于提供更具体的建议。脚本是否作为不同的线程或子任务运行?如果是这样的话,当它们完成时,您似乎没有正确地终止它们,并且您遇到了资源匮乏。如果没有,我相信我可以想出任何非通用的建议,例如,添加日志记录,确保您不会默默地吃掉异常,等等,在调试器中运行,并在程序挂起时中断执行,以查看正在运行的代码。这似乎很明显,但应该提到,当程序挂起并响应^C时,您还应该得到一个堆栈跟踪,它应该让您对挂起时运行的代码有一些了解。当挂起时,CPU是最大的还是至少有一次内核,并且接近0%的CPU-告诉您是否在紧循环中运行,并且正在阻塞I/O、套接字、资源等。我应该在OP中解释CTRL-C之后没有堆栈跟踪,因为脚本已经完成了Python代码的执行。这就是为什么我不知道在哪里寻找问题,因此,没有代码显示。此外,当挂起时,任务管理器显示一个核心在一段时间内被最大化25%,但随后该活动减弱为0。我还应该解释,只有当我从文件中读取初始化数据结构所需的数据并且需要取消pickle时,问题才会出现。所以我怀疑这个问题与IO有关。不涉及线程。不知道这是否有帮助,但我已使用cProfile查看是否可以识别问题。我像这个cProfile一样导入了整个模块。运行“导入规范”。但遗憾的是,报告是在1.4秒后生成的,然后控制台像往常一样挂起。