注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[python] 每日一库 ---- weakref  

2011-10-21 16:49:04|  分类: lang_python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
基本用法
import weakref
d = weakref.WeakValueDictionary()
d[1] = Foo()
d[1] 立即被回收,因为 Foo() 除了 d[1] 没有其他地方引用

d = weakref.WeakKeyDictionary()
d[Foo()] = 1
同理,d[Foo()] 立即被回收掉了

weakref.ref(obj) 返回一个 wrobj。
wrobj() 可以返回实际的 obj 或者 None。

>>> def callback(obj):
...   print 'wobj', obj
...
>>> class Foo(object):
...   pass
...
>>> gc.disable()
>>> gc.set_debug(gc.DEBUG_LEAK)
>>> f = weakref.ref(Foo(), callback)
wobj <weakref at 00000000027D7228; dead>
>>> a = Foo()
>>> b = weakref.ref(a, callback)
>>> print b
<weakref at 00000000027D7278; to 'Foo' at 00000000027D9278>
>>> b()
<__main__.Foo object at 0x00000000027D9278>
>>> a = 1
>>> gc.collect()
wobj <weakref at 00000000027D7278; dead>

关于 weakref.proxy(),返回一个 proxy 方便使用。
>>> class Foo(object):
...   def gogo(self):
...     print 'Foo.gogo'
...
>>> a = Foo()
>>> b = weakref.proxy(a)
>>> b.gogo()
Foo.gogo
>>> del a
>>> b.gogo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ReferenceError: weakly-referenced object no longer exists

getwreakrefcount() 和 getweakrefs()
>>> a = Foo()
>>> b = weakref.ref(a)
>>> c = weakref.proxy(a)
>>> weakref.getweakrefcount(a)
2
>>> weakref.getweakrefs(a)
[<weakref at 00000000027D72C8; to 'Foo' at 00000000027D9240>, <weakproxy at 0000
0000027C1728 to Foo at 00000000027D9240>]

设计初衷
map[key] = value
用来做 cache, 如果不支持 weakref,则
  1. map 越来越大
  2. 手工处理释放问题,繁琐

具体实现
Modules/_weakref.c, 封装了一下 Objects/weakrefobject.c

Include/weakrefobject.h
Objects/weakrefobject.c
PyWeakReference, 
  wr_object, 此 weakref 所指向的实际的 object
  wr_callback, object die 的时候,callback
  hash,
  wr_prev / wr_next, 组成链表

在 PyObject 上,保存着一份 PyWeakReference 的 Double-Linked List
(PyObject pointer + PyTypeObject.tp_weaklistoffset)
wrobj     -> wrobj
wr_next -/   wr_next ...
getwreakrefcount(), 遍历此 list 计算 count
getweakrefs(), 根据此 list 生成一个 PyList_New() 返回
  评论这张
 
阅读(3157)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017