的Python:经由一个终结冲洗程序终止之前的缓冲
-
23-08-2019 - |
题
我保持事务的高速缓存刷新(到永久存储)上的水印或对象终止的事件。由于__del__
是不再保证被名为每个对象,是勾类似的功能(或__del__
本身)到atexit.register
(初始化期间),合适的方法?
如果我没有记错,这将导致该方法势必流连直到程序结束的对象。这是不太可能是一个问题,但也许有一个更好的解决方案?
注意:我知道使用__del__
是不理想的,因为它可能会导致抓不到例外的,但我想不出另一种方式做到这短短的级联finalize()
的要求通过我的程序的所有道路。 TIA!
其他提示
如果你必须处理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
是去这里的路。
不隶属于 StackOverflow