ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何在python中可靠地进行清理?

2019-12-10 15:56:04  阅读:270  来源: 互联网

标签:cyclic-reference ctypes 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有