Python 2.7中无引用循环的OrderedDict替代方案咨询
解决Python 2.7中OrderedDict的引用循环GC残留问题
我们在排查自研包的Python GC垃圾残留问题时,碰到了一个棘手的情况:
- Python 2.7自带的
collections.OrderedDict无法通过引用计数机制直接销毁,必须进入GC流程处理。通过pprint分析其引用关系,发现了明确的循环引用:<type 'list'> object at 0x10a876ab8: [ <Recursive reference to list object at 0x10a876ab8>, <Recursive reference to list object at 0x10a876ab8>, None] - 这个问题其实是Python的一个已知旧bug,在Python 3.2版本中已经被修复,Python 3.7及以上版本完全不存在这个引用循环问题。
- 我们还验证了第三方库的
ordereddict.OrderedDict,结果发现它也存在同样的引用循环问题。
可行的替代方案
因为业务需要,我们必须为Python 2.7版本提供自研包支持(尽管该版本已经停止官方维护),经过验证,找到了一个有效的替代实现:
- Django 1.7版本的SortedDict:这个版本的SortedDict不存在引用循环问题,可以正常通过引用计数销毁。需要注意的是,SortedDict在Django 1.11及以后的版本中已经被移除,所以建议直接把该类的代码单独提取出来集成到自研包中,无需依赖整个Django框架。
内容的提问来源于stack exchange,提问作者Andreas Maier
相关产品推荐
相关产品推荐

