在阅读了大量关于这个问题的数据后,我仍然找不到解决问题的任何实际方法(可能没有)。
我的问题如下:
在我的项目中,我有多个驱动程序处理各种硬件(IO管理器、可编程负载、电源等等)。
初始化到这些硬件的连接是昂贵的(及时),我不能打开然后关闭我们之间的每一个通信迭代连接。
这意味着I不能这样做(假设可编程加载实现了输入/退出):
start of code...
with programmable_load(args) as program_instance:
programmable_load_instance.do_something()
rest of code...所以我找了一个不同的解决方案:
class programmable_load():
def __init__(self):
self.handler = handler_creator()
def close_connection(self):
self.handler.close_connection()
self.handler = None
def __del__(self):
if (self.handler != None):
self.close_connection()由于明显的原因,我不相信析构函数真的会被调用,所以当我想要结束我的程序时(对于所有的驱动程序),我都会显式地调用close_connection()。
此问题发生在我突然终止进程时,例如,当我通过调试模式运行并退出调试时。
在这些情况下,进程终止而不通过任何析构函数运行。我知道操作系统在这个时候会清除所有未使用的内存,但是有任何方法可以有组织地清除内存吗?
如果没有,是否有办法使退出调试函数通过一组特定的函数?python进程是否知道它得到了一个相当大的调试事件,还是将其视为一个正常的终止?
操作系统: Windows
发布于 2018-06-19 11:22:38
由于这里没有安装wingide,所以我没有正确地进行测试,所以我不能允许您这样做,但是使用setconsolectrlhandler处理程序会怎么样呢?例如,尝试这样的方法:
import os
import sys
import win32api
if __name__ == "__main__":
def callback(sig, func=None):
print("Exit handler called!")
try:
win32api.SetConsoleCtrlHandler(callback, True)
except Exception as e:
print("Captured exception", e)
sys.exit(1)
print("Press to quit")
input()
print("Bye!")它将能够处理CTRL+C和CTRL+BREAK信号:

发布于 2018-06-13 20:51:03
正如注释中提到的,您可以使用退出进行清理。但是,只有当进程被要求关闭(例如,Linux上的退出信号)而不只是终止(就像停止调试会话时可能发生的情况一样)时,这才能起作用。类似地,如果你强迫你的电脑关闭(例如长按电源按钮或移除电源),那么它也不会被调用。由于明显的原因,没有任何“解决办法”。当电源突然关闭或被强行杀死时,您的程序不能被调用。强行杀人的目的是现在就一定要扼杀这个过程。如果它首先调用了您的清理代码,那么您可以延迟那些违背目的的代码。这就是为什么会有信号,比如要求你的过程停止。这不是Python特有的。同样的概念也适用于操作系统。
奖励(设计建议,而不是解决方案):我认为您仍然可以使用上下文管理器(使用with)。你的问题不是独一无二的。数据库连接通常也会保持较长时间。这是一个范围问题。将上下文进一步移到应用程序级别。然后很清楚边界是什么,并且您不需要任何魔法(您可能也知道@contextmanager可以轻而易举地做到这一点)。
https://stackoverflow.com/questions/50782326
复制相似问题