我保持事务的高速缓存刷新(到永久存储)上的水印或对象终止的事件。由于__del__不再保证被名为每个对象,是勾类似的功能(或__del__本身)到atexit.register(初始化期间),合适的方法?

如果我没有记错,这导致该方法势必流连直到程序结束的对象。这是不太可能是一个问题,但也许有一个更好的解决方案?

注意:我知道使用__del__是不理想的,因为它可能会导致抓不到例外的,但我想不出另一种方式做到这短短的级联finalize()的要求通过我的程序的所有道路。 TIA!

有帮助吗?

解决方案

如果你不需要你的目标是在你执行刷新的时间还活着,你可以使用的

这是类似于你提出的解决方案,而不是使用一个真正的参考,存储弱引用的列表,一个回调函数来进行冲洗。这样,引用不打算保留这些对象还活着,你就不会遇到与__del__方法的任何圆形的垃圾问题。

您可以通过在终端弱引用的列表中运行手动刷新任何还活着,如果这需要在某一个点来保证完成。

其他提示

如果你必须处理ressources的首选方法是有一个close()finalize()方法的显式调用。看一看在with声明抽象一点。在你的情况weakref模块可能是一种选择。缓存的对象可以是由系统收集的垃圾和调用其__del__()方法,或者你完成他们是否还活着。

我要说atexit或尝试,看看您是否可以重构代码到能够使用with_statement是在2.5 __future__和2.6默认表示。 2.5包括:模块contextlib简化事情有点。我已经使用Canonical的风暴ORM的时候做这样的事情。

这的将来导入with_statement

@contextlib.contextmanager
def start_transaction(db):
  db.start()
  yield
  db.end()

with start_transaction(db) as transaction:
  ...

对于非分贝的情况下,你可以只注册到与全球冲洗的对象,然后使用类似的东西。这种方法的好处是,它使事情变得明确。

将以下在名为destructor.py文件

import atexit

objects = []

def _destructor():
    global objects
    for obj in objects:
        obj.destroy()
    del objects

atexit.register(_destructor)

现在使用这种方式:

import destructor

class MyObj(object):
    def __init__(self):
        destructor.objects.append(self)
        # ... other init stuff
    def destroy(self):
        # clean up resources here

我觉得atexit是去这里的路。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top