代码之家  ›  专栏  ›  技术社区  ›  piotr

异常后对象的垃圾收集

  •  1
  • piotr  · 技术社区  · 16 年前

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

    B持有一个在销毁时释放的锁(它是C++对象) 异常由b.get()引发。

    3 回复  |  直到 16 年前
        1
  •  1
  •   John La Rooy    16 年前

    你需要这样做,以确保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添加一些代码,使其作为上下文工作

        2
  •  3
  •   Daniel G    16 年前

    无论发生什么,您都希望释放锁—无论是否引发异常。在这种情况下,最好在 finally: 条款:

    b=BigHash(DB_DIR, url)
    try:
        meta = bdecode(b.get())
    finally:
        del b # or whatever you need to do to release the lock
    return meta
    

    您还可以使用上下文管理器- http://docs.python.org/library/stdtypes.html#typecontextmanager . 只需添加代码即可释放 BigHash.__exit__ 函数,该函数将在离开 with 在以下代码中执行块:

    with BigHash(DB_DIR, url) as b:
        meta = bdecode(b.get())
    return meta
    
        3
  •  0
  •   Mike Graham    16 年前

    使命感 del 名字是你永远不应该做的事。 德尔 不保证对基础对象将发生的情况有任何有用的信息。 你永远不应该依赖一个朋友 __del__ 你需要发生的事情的方法。

    德尔 只删除对对象的一个引用,这可能会使您在未经思考的情况下进行更多操作时感到困惑。所以,, 德尔 用于清理命名空间,而不是控制对象的生存期,以及 这甚至都不太好 控制名称生命周期的正确方法是将其放在函数中,并使其超出范围或放在with块中。

    你需要装备 BigHash 具有释放锁的能力 明确地 release unlock close 方法。如果要将其与上下文管理器一起使用( with __exit__ ,将在可预测的、有用的时间调用。