首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保证进程终止时销毁

保证进程终止时销毁
EN

Stack Overflow用户
提问于 2018-06-10 09:33:03
回答 3查看 196关注 0票数 6

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

我的问题如下:

在我的项目中,我有多个驱动程序处理各种硬件(IO管理器、可编程负载、电源等等)。

初始化到这些硬件的连接是昂贵的(及时),我不能打开然后关闭我们之间的每一个通信迭代连接。

这意味着I不能这样做(假设可编程加载实现了输入/退出):

代码语言:javascript
复制
start of code...

with programmable_load(args) as program_instance:
     programmable_load_instance.do_something()

rest of code...

所以我找了一个不同的解决方案:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-19 11:22:38

由于这里没有安装wingide,所以我没有正确地进行测试,所以我不能允许您这样做,但是使用setconsolectrlhandler处理程序会怎么样呢?例如,尝试这样的方法:

代码语言:javascript
复制
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+CCTRL+BREAK信号:

票数 1
EN

Stack Overflow用户

发布于 2018-06-13 20:51:03

正如注释中提到的,您可以使用退出进行清理。但是,只有当进程被要求关闭(例如,Linux上的退出信号)而不只是终止(就像停止调试会话时可能发生的情况一样)时,这才能起作用。类似地,如果你强迫你的电脑关闭(例如长按电源按钮或移除电源),那么它也不会被调用。由于明显的原因,没有任何“解决办法”。当电源突然关闭或被强行杀死时,您的程序不能被调用。强行杀人的目的是现在就一定要扼杀这个过程。如果它首先调用了您的清理代码,那么您可以延迟那些违背目的的代码。这就是为什么会有信号,比如要求你的过程停止。这不是Python特有的。同样的概念也适用于操作系统。

奖励(设计建议,而不是解决方案):我认为您仍然可以使用上下文管理器(使用with)。你的问题不是独一无二的。数据库连接通常也会保持较长时间。这是一个范围问题。将上下文进一步移到应用程序级别。然后很清楚边界是什么,并且您不需要任何魔法(您可能也知道@contextmanager可以轻而易举地做到这一点)。

票数 2
EN

Stack Overflow用户

发布于 2018-06-13 21:25:21

根据这份文件

如果进程被TerminateProcess终止,进程的所有线程都会立即终止,而不可能运行其他代码.

(强调我的)这意味着在这种情况下你什么也做不了。

正如详细的这里一样,信号在ms-windows上不能很好地工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50782326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档