Python 异常后对象的垃圾收集

Python 异常后对象的垃圾收集,python,exception-handling,destructor,Python,Exception Handling,Destructor,我观察到,在一个异常之后,我有一个未调用构造函数的对象,这导致锁被持有。改善这种状况的最佳方法是什么?在except块中调用del是解决方案吗 b=BigHash(DB_DIR, url) meta = bdecode(b.get()) return meta b持有一个在销毁时释放的锁,它是C++对象 b.get引发异常。您需要执行类似的操作以确保b处于解锁状态 b=BigHash(DB_DIR, url) try: meta = bdecode(b.get()) retu

我观察到,在一个异常之后,我有一个未调用构造函数的对象,这导致锁被持有。改善这种状况的最佳方法是什么?在except块中调用del是解决方案吗

b=BigHash(DB_DIR, url)
meta = bdecode(b.get())
return meta
b持有一个在销毁时释放的锁,它是C++对象
b.get引发异常。

您需要执行类似的操作以确保b处于解锁状态

b=BigHash(DB_DIR, url)
try:
    meta = bdecode(b.get())
    return meta
finally:
    #unlock b here
如果BigHash可以作为上下文工作,那么您可以编写

with b as BigHash(DB_DIR, url):
    meta = bdecode(b.get())
    return meta

您可能需要向BigHash中添加一些代码,使其作为上下文工作,不过您需要执行类似的操作,以确保b处于解锁状态

b=BigHash(DB_DIR, url)
try:
    meta = bdecode(b.get())
    return meta
finally:
    #unlock b here
如果BigHash可以作为上下文工作,那么您可以编写

with b as BigHash(DB_DIR, url):
    meta = bdecode(b.get())
    return meta

您可能需要向BigHash中添加一些代码,使其作为上下文工作,但无论如何,您都希望释放锁—无论是否引发异常。在这种情况下,最好在finally:子句中释放锁/删除b:

您还可以使用上下文管理器-。只需添加代码即可释放BigHash.\uuuu exit\uuu函数中的锁,在以下代码中离开with块后将调用该函数:

with BigHash(DB_DIR, url) as b:
    meta = bdecode(b.get())
return meta

无论发生什么,您都希望释放锁—无论是否引发异常。在这种情况下,最好在finally:子句中释放锁/删除b:

您还可以使用上下文管理器-。只需添加代码即可释放BigHash.\uuuu exit\uuu函数中的锁,在以下代码中离开with块后将调用该函数:

with BigHash(DB_DIR, url) as b:
    meta = bdecode(b.get())
return meta
用名字称呼戴尔是你永远不应该做的事。调用del不能保证对底层对象将发生什么有用。对于你需要发生的事情,你永远不应该依赖于一个“del”方法

del只删除了对对象的一个引用,当您可能未经思考就做了更多的引用时,这可能会让人困惑。因此,del对于清理名称空间很有用,而不是控制对象的生存期,而且控制名称生存期的正确方法是将其放入函数中,并使其超出范围或放入with块,这一点也不好

您需要为BigHash配备显式释放锁的能力,使用release、unlock或close方法。如果要将其与上下文管理器一起使用,可以定义_uexit _uu,它将在可预测的、有用的时间被调用

用名字称呼德尔是你以前不应该做的事。调用del不能保证对底层对象将发生什么有用。对于你需要发生的事情,你永远不应该依赖于一个“del”方法

del只删除了对对象的一个引用,当您可能未经思考就做了更多的引用时,这可能会让人困惑。因此,del对于清理名称空间很有用,而不是控制对象的生存期,而且控制名称生存期的正确方法是将其放入函数中,并使其超出范围或放入with块,这一点也不好


您需要为BigHash配备显式释放锁的能力,使用release、unlock或close方法。如果要将其与上下文管理器一起使用,可以定义_uexit _uu,它将在可预测的、有用的时间被调用

我不能使用with或其他语言技巧吗?在C++中,我发现一个对象脱离了范围并没有被破坏的问题。@ PopTrr,当对象超出范围时,它被破坏,但它可能修改了BigAh的锁定状态。你能展示BigA什的来源吗?它是几百行C++,所以这是不切实际的。重要的是,bucket在构造函数上被锁定,在析构函数上被解锁。python的GC似乎把对象放在一边,除了在这个实例中,您将使用finally之外,您不会使用它。除非在任何情况下都没有裸代码,否则您都不会使用裸代码。@piotr,现有代码的大小无关紧要,您只需添加uuu enter和uu exit方法即可使用。另一种方法是使用锁管理器包装类。我不能使用with或其他语言技巧吗?在C++中,我发现一个对象脱离了范围并没有被破坏的问题。@ PopTrr,当对象超出范围时,它被破坏,但它可能修改了BigAh的锁定状态。你能展示BigA什的来源吗?它是几百行C++,所以这是不切实际的。重要的是,bucket在构造函数上被锁定,在析构函数上被解锁。python的GC似乎把对象放在一边,除了在这个实例中,您将使用finally之外,您不会使用它。除非在任何情况下都没有裸代码,否则您都不会使用裸代码。@piotr,现有代码的大小无关紧要,您只需添加uuu enter和uu exit方法即可使用。另一种方法是将类包装为wi
Tha是一个锁管理器。令人惊讶的是,在Python2.5.4中,它无法使用。没有调用析构函数。@piotr:您的BigHash类必须定义_exit__)方法才能很好地使用。令人惊讶的是,在Python2.5.4中,这不适用。没有调用析构函数。@piotr:您的BigHash类必须定义_exit__)方法才能很好地使用。看见