在阅读了大量关于这个问题的数据之后,我仍然找不到任何解决我问题的方法(可能根本就没有)。在
我的问题如下:
在我的项目中,我有多个驱动程序可以处理各种硬件(IO管理器、可编程负载、电源等)。在
初始化与这些硬件的连接是昂贵的(在时间上),我不能打开然后关闭我们之间的每次通信迭代的连接。在
意思是我不能这样做(假设可编程加载工具进入/退出):
start of code...
with programmable_load(args) as program_instance:
programmable_load_instance.do_something()
rest of code...
所以我选择了另一种解决方案:
^{pr2}$由于明显的原因,我不相信析构函数会被调用,所以当我想结束程序时(对于所有驱动程序),我显式地调用close_connection()。在
例如,当调试过程突然发生时,我退出调试模式。在
在这些情况下,进程终止而不运行任何析构函数。 我知道操作系统会清除所有未使用的内存,但是有没有办法以一种有组织的方式清除内存?在
如果没有,有没有办法让quit调试函数通过一组特定的函数?python进程是否知道它得到了一个相当好的调试事件,还是将其视为正常的终止?在
操作系统:Windows
我没有正确测试,因为我没有在这里安装wingede,所以我不能同意你这样做可以,但是使用setconsolectrlhandler怎么办?例如,请尝试以下操作:
它将能够处理}信号:
CTRL+C
和{正如在评论中提到的,您可以使用atexit来进行清理。但这只在进程被要求关闭(例如Linux上的QUIT signal)而不是被终止(停止调试会话时很可能就是这样)。类似地,如果你强迫你的电脑关机(例如长按电源按钮或切断电源),那么它也不会被调用。因为显而易见的原因,没有“解决方案”。当电源突然关闭或被强制关闭时,程序不能被调用。强制杀戮的目的是现在就绝对地终止进程。如果它首先调用了你的清理代码,那么你可以延迟这一不符合目的的代码。这就是为什么会有诸如请求进程停止之类的信号。这不是Python特有的。同样的概念也适用于操作系统。在
好处(设计建议,不是解决方案):我认为您仍然可以使用上下文管理器(使用
with
)。你的问题不是唯一的。数据库连接通常也会保持更长的时间。这是一个范围问题。将上下文进一步向上移动到应用程序级别。然后就可以清楚地知道边界是什么了,而且您不需要任何魔法(您可能还知道@contextmanager可以轻松实现这一点)。在根据this documentation:
这意味着在这种情况下你无能为力。在
正如详细的here,信号在ms windows上工作不太好。在
相关问题 更多 >
编程相关推荐