如何在python中可靠地进行清理?
作者:互联网
我有一些ctypes绑定,并且对于每个body.New我应该称其为body.Free.我绑定的库没有与其余代码隔离的分配例程(可以在代码的任何地方调用它们),要使用几个有用的功能,我需要进行循环引用.
我认为这将解决是否能找到一种可靠的方式将析构函数挂接到对象上. (如果弱引用会在删除数据之前给我回调,则弱引用会有所帮助.
所以很显然,当我放入Velocity_func时,此代码失败了:
class Body(object):
def __init__(self, mass, inertia):
self._body = body.New(mass, inertia)
def __del__(self):
print '__del__ %r' % self
if body:
body.Free(self._body)
...
def set_velocity_func(self, func):
self._body.contents.velocity_func = ctypes_wrapping(func)
我还尝试通过weakrefs解决此问题,这些情况似乎变得越来越糟,只是更加难以预测.
即使我不输入Velocity_func,也至少在执行此操作时会出现循环:
class Toy(object):
def __init__(self, body):
self.body.owner = self
...
def collision(a, b, contacts):
whatever(a.body.owner)
那么,如何确保即使共享库分配/释放了结构,结构也将被垃圾回收?
如果您对更多详细信息感兴趣,则有一个存储库:http://bitbucket.org/cheery/ctypes-chipmunk/
解决方法:
不幸的是,您想要做的就是创建一个对象,该对象先分配一些东西,然后在不再使用该对象时自动取消分配,这在Python中几乎是不可能的.不能保证会调用del语句,因此您不能依赖它.
Python中的标准方法很简单:
try:
allocate()
dostuff()
finally:
cleanup()
或者从2.5开始,您还可以创建上下文管理器并使用with语句,这是一种更简洁的方法.
但是,这两个都是主要用于在代码段开头分配/锁定时使用的.如果要为程序的整个运行分配资源,则需要在启动时在程序的主代码运行之前分配资源,然后在之后分配资源.这里没有涉及一种情况,即当您要动态分配和取消分配许多资源并在代码中的许多地方使用它们时.例如,您需要一个内存缓冲区池或类似的池.但是大多数情况是为了内存,Python将为您处理这些情况,因此您不必理会这些.当然,在某些情况下,您希望对不是内存的事物进行动态池分配,然后您需要在示例中尝试的解除分配类型,而这对于Python来说是棘手的.
标签:cyclic-reference,ctypes,python 来源: https://codeday.me/bug/20191210/2102784.html