就是我们有一个 redis 的公共文件自定义了一个方法使用了 pipline,举个例子: 比如这个是一次从一个 list 一次 pop 出多个元素
def lpopn(self, name, n):
"""一次 pop 多个元素"""
pipe = self.pipeline()
pipe.lrange(name, 0, n - 1)
pipe.ltrim(name, n, -1)
raw_list, is_succ = pipe.execute()
return raw_list
之前写了一个脚本用来收集 redis 中的数据入库用了这个方法,导致脚本运行时发现了内存泄漏,然后使用内存监控工具定位到了是这个 redis.client.Pipeline 这个对象占用了大量内存,之前记得有 python 的坑说的是 如果在循环引用中的对象定义了 del,那么 python gc 不能进行回收,然后我就点进 pipeline 里面看确实是定义了 del
class Pipeline(BasePipeline, Redis):
"Pipeline for the Redis class"
pass
class BasePipeline(object):
# 省略了其他方法
def __del__(self):
try:
self.reset()
except Exception:
pass
然后我就改成 脚本里面全局创建一个 pipline 对象传进这个方法,然后问题就解决了,但是不明白这个 pipeline 怎么就循环引用了呢,不知道是不是这个原因,希望有 v 友能解答一下疑惑,给点思路
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.