• [Pyhton]weakref 弱引用


    文档中的解释: https://docs.python.org/2/library/weakref.html

    wiki 中的解释: 在计算机程序设计中,弱引用。与强引用相对。是指不能确保其引用的对象不会被垃圾回收器回收的引用。一个对象若仅仅被弱引用所引用,则被觉得是不可訪问(或弱可訪问)的,并因此可能在不论什么时刻被回收。主要作用就是降低循环引用。降低内存中不必要的对象存在的数量。

    更具体的请查看wiki百科


    简单理解:

    python中的垃圾回收机制是是引用计数器。当一个对象的引用数目为0的时候,才会被从内存中回收。当出现循环引用的时候,垃圾回收就变得不可靠了。



    通过一段代码来比較:

    # -*- encoding=utf-8 -*-
    '''
    author: orangleliu
    
    python 弱引用的小实验
    '''
    
    import weakref
    import gc
    
    class NewObj(object):
        def my_method(self):
            print "called me "
    
    obj = NewObj()
    r = weakref.ref(obj)
    gc.collect()
    print  r() is obj
    
    obj = 1
    gc.collect()  #
    print  r() is None, r()
    
    print '*******************'
    obj = NewObj()
    s = obj
    gc.collect()
    print s is obj
    
    obj = 1
    gc.collect()
    print s is None, s
    

    对照结果:

    True
    True None
    *******************
    True
    False <__main__.NewObj object at 0x024FB870>


    非常easy看到结果,弱引用计数器没有添加,所以当obj不在引用NewObj的时候,NewObj对象就被释放了,所以r的引用对象就没了。后面的s对象和我们平时用的引用对象是一样的,s =obj 时候,引用计数器+1,所以当obj不在指向NewObj的时候,s仍然指向NewObj。此时对NewObj的引用计数为2-1=1.


    通过实验能够看到了原理。能够这个弱引用一般在什么详细的情况下用呢。怎么避免了循环引用,能够參考 Pymontw中的案例:http://pymotw.com/2/weakref/

    实际开发中还没怎么处理过这个问题。以后用到在深入研究


    本文出自 “orangleliu笔记本” 博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/40718121

    作者: orangleliu  



  • 相关阅读:
    HiveServer2的配置使用
    hBase-thrift 实践(java)
    Building Apache Thrift on CentOS 6.5
    linux安装thrift
    Apache Thrift with Java Quickstart(thrift入门及Java实例)
    [转载]/etc/security/limits.conf解释及应用
    storm 入门原理介绍
    Storm的wordCounter计数器详解
    CentOS6.5 安装python
    HBase 协处理器统计行数
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7200270.html
Copyright © 2020-2023  润新知