保证进程终止时调用销毁

2024-05-23 14:55:51 发布

您现在位置:Python中文网/ 问答频道 /正文

在阅读了大量关于这个问题的数据之后,我仍然找不到任何解决我问题的方法(可能根本就没有)。在

我的问题如下:

在我的项目中,我有多个驱动程序可以处理各种硬件(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


Tags: of数据项目方法instance函数内存io
3条回答

我没有正确测试,因为我没有在这里安装wingede,所以我不能同意你这样做可以,但是使用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和{}信号:

enter image description here

正如在评论中提到的,您可以使用atexit来进行清理。但这只在进程被要求关闭(例如Linux上的QUIT signal)而不是被终止(停止调试会话时很可能就是这样)。类似地,如果你强迫你的电脑关机(例如长按电源按钮或切断电源),那么它也不会被调用。因为显而易见的原因,没有“解决方案”。当电源突然关闭或被强制关闭时,程序不能被调用。强制杀戮的目的是现在就绝对地终止进程。如果它首先调用了你的清理代码,那么你可以延迟这一不符合目的的代码。这就是为什么会有诸如请求进程停止之类的信号。这不是Python特有的。同样的概念也适用于操作系统。在

好处(设计建议,不是解决方案):我认为您仍然可以使用上下文管理器(使用with)。你的问题不是唯一的。数据库连接通常也会保持更长的时间。这是一个范围问题。将上下文进一步向上移动到应用程序级别。然后就可以清楚地知道边界是什么了,而且您不需要任何魔法(您可能还知道@contextmanager可以轻松实现这一点)。在

根据this documentation

If a process is terminated by TerminateProcess, all threads of the process are terminated immediately with no chance to run additional code.

这意味着在这种情况下你无能为力。在

正如详细的here,信号在ms windows上工作不太好。在

相关问题 更多 >