12

长话短说,我有一个大量的 Python 应用程序,除其他外,它在 Linux 上调用“losetup”、“mount”等。本质上是消耗完成后必须释放的系统资源。

如果我的应用程序崩溃,我想确保正确释放这些系统资源。

执行以下操作是否有意义?

def main():
    # TODO: main application entry point
    pass

def cleanup():
    # TODO: release system resources here
    pass

if __name__ == "__main__":
    try:
        main()
    except:
        cleanup()
        raise

这是通常做的事情吗?有没有更好的办法?也许是单例类中的析构函数?

4

6 回答 6

11

我喜欢一般的顶级异常处理程序(不管语言)。它们是清理资源的好地方,这些资源可能与引发异常的方法中消耗的资源没有直接关系。

如果您有这样的框架,它也是记录这些异常的好地方。顶级处理程序将捕获那些您没有计划的奇怪异常,并让您在将来更正它们,否则您可能根本不知道它们。

请注意您的顶级处理程序不会引发异常!

于 2008-09-18T18:55:38.120 回答
7

析构函数(如在 __del__ 方法中)是一个坏主意,因为不能保证调用它们。atexit 模块是一种更安全的方法,尽管如果 Python 解释器崩溃(而不是 Python 应用程序),或者使用 os._exit(),或者进程被积极终止,或者机器重新启动,这些模块仍然不会触发。(当然,最后一项在您的情况下不是问题。)如果您的进程容易崩溃(例如,它使用变化无常的第三方扩展模块),您可能希望在一个简单的父进程中进行清理更多的隔离。

如果您并不担心,请使用 atexit 模块。

于 2008-09-18T18:56:07.933 回答
2

应用程序范围的处理程序很好。它们非常适合记录。只要确保应用程序范围内的应用程序是耐用的并且不太可能自行崩溃。

于 2008-09-18T18:54:18.623 回答
2

如果你使用类,你当然应该释放它们在析构函数中分配的资源。在整个应用程序上使用 try: 只是为了释放尚未被类的析构函数释放的资源。

而不是使用包罗万象的 except:,您应该使用以下块:

try:
    main()
finally:
    cleanup()

这将确保以更 Pythonic 的方式进行清理。

于 2008-09-18T23:45:15.290 回答
1

这似乎是一种合理的方法,并且比单例类的析构函数更直接和可靠。您还可以查看“ atexit ”模块。(发音为“at exit”,而不是“a tex it”或类似的东西。我混淆了很长时间。)

于 2008-09-18T18:56:44.717 回答
1

考虑编写上下文管理器并使用 with 语句。

于 2008-09-23T10:26:25.297 回答