首页 > 系统相关 >Python cache 内存泄漏问题

Python cache 内存泄漏问题

时间:2024-11-15 16:30:57浏览次数:1  
标签:__ 缓存 obj Python self cache 内存 def

@functools.cache 函数装饰器在一些特殊情况的时候会影响变量引用计数器的计数,从而导致内存泄漏。比如:@functools.cache和@@functools.property一起使用的时候,或者更复杂的嵌套引用

 1 from functools import wraps
 2 
 3 
 4 class CacheManager:
 5     def __init__(self):
 6         self._cache = {}
 7 
 8     def get_cache_obj(self, key):
 9         """获取缓存对象"""
10         return self._cache.get(key)
11 
12     def add_cache_obj(self, key, obj):
13         """添加缓存对象"""
14         self._cache[key] = obj
15         return obj
16 
17     def __del__(self):
18         """清除所有缓存对象"""
19         # print(f"CacheManager del")
20         for k, v in self._cache.items():
21             # print(f"CacheManager del:{k=}")
22             del v
23         self._cache.clear()
24         del self._cache
25 
26     @classmethod
27     def cache_result(cls, func):
28         """
29         装饰器:缓存结果,支持参数作为缓存的唯一键。
30         """
31 
32         @wraps(func)
33         def wrapper(instance, *args, **kwargs):
34             # 根据函数名和参数构建唯一缓存键
35             key = f"{func.__name__}:{args}:{kwargs}"
36 
37             # 检查是否已缓存
38             cache_obj = instance.cache_manager.get_cache_obj(key)
39             if cache_obj is not None:
40                 return cache_obj
41 
42             # 缓存中没有对象,执行函数并缓存结果
43             result = func(instance, *args, **kwargs)
44             instance.cache_manager.add_cache_obj(key, result)
45             return result
46 
47         return wrapper

测试demo

 1 from base.utils.tools import CacheManager
 2 
 3 
 4 class MyClass:
 5     def __init__(self):
 6         self.cache_manager = CacheManager()
 7 
 8     def __del__(self):
 9         print("MyClass.__del__")
10 
11     @property
12     @CacheManager.cache_result
13     def oms_user(self):
14         # 该代码只在缓存不存在时执行
15         return [1, 2, 3]
16 
17 
18 def test_cache():
19     m = MyClass()
20     print(id(m.oms_user))
21     print(id(m.oms_user))

 

标签:__,缓存,obj,Python,self,cache,内存,def
From: https://www.cnblogs.com/watermeloncode/p/18548212

相关文章

  • Python并发编程入门:使用concurrent.futures与asyncio
    Python并发编程入门:使用concurrent.futures与asyncio在现代应用中,并发编程已成为一种提升性能和效率的重要手段。Python提供了多种实现并发的方式,尤其是concurrent.futures和asyncio,分别适用于不同的并发场景。本文将带你深入了解这两种并发编程方式,帮助你轻松上手并......
  • 【Python】将同一目录下的多个doc文件批量转为docx文件
    同一目录有多个doc文件: importwin32com.clientaswcimportos#设置.doc文件所在的目录docs_directory=r'F:\xxx\PycharmProjects\Python学习项目\doc文件'defgetpath(docs_directory):#输出docx文件的路径和名称[路径,名称]#遍历目录中的所有.doc文件......
  • C语言进阶3:字符串+内存函数
    本章重点求字符串长度strlen长度不受限制的字符串函数strcpystrcatstrcmp长度受限制的字符串函数strncpystrncatstrncmp字符串查找strstrstrtok误信息报告strerror字符操作内存操作memcpymemmovememcmpmemset0.前言:C语言中对字符和字符串的处理很是......
  • 【Python】将同一目录下的多个docx文件内容写入同一个txt文件
    同一目录下有多个docx文件 importdocximportoslist_w=[]forfilenameinos.listdir(r"F:\xxxx\PycharmProjects\Python学习项目\docx文件"):iffilename.endswith('.docx'):#如果文件以.docx结尾document=docx.Document("F:\\xxxx\......
  • python2.7安装pip
    我的python版本号具体信息如下:Python2.7(r27:82525,Jul42010,07:43:08)[MSCv.150064bit(AMD64)]onwin32Type"help","copyright","credits"or"license"formoreinformation.python2.7没有自带pip工具,需要安装一个setuptools包,我使用的py......
  • Python文件操作
    七、文件操作7.1文件打开和关闭打开文件open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)file:文件路径mode:文件打开模式文本模式'r':只读模式(默认),文件必须存在。'w':写入模式,若文件存在则清空内容,若不存......
  • 网页直播/点播播放器EasyPlayer.js RTSP播放器出现多路视频卡顿、内存开始飙升的原因
    EasyPlayer.jsRTSP播放器是TSINGSEE青犀流媒体组件系列中关注度较高的产品,经过多年的发展和迭代,目前已经有多个应用版本,包括RTSP版、RTMP版、Pro版以及js版,其中js版本作为网页播放器,受到了用户的广泛使用。1、问题说明在已经使用硬解码基础上,播放多路视频,会出现卡顿,内存开始飙......
  • 基于yolov10的柿子成熟度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python
     更多目标检测和图像分类识别项目可看我主页其他文章功能演示:yolov10,柿子成熟度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili(一)简介基于yolov10的柿子成熟度检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训练好的......
  • Tomcat Windows 服务 JVM 内存参数设置
    Tomcat在Windows平台上启动服务的方式是CommonsDaemon,JVM的启动参数可以有多种设置方法。本文介绍CommonsDaemon的大致组成和参数设置方法。CommonsDaemon由两部分组成。一是由C语言开发负责和操作系统交互的平台相关程序,在Windows上平台相关部分是procrun,在Un......
  • python的decimal默认精度为28
    python的decimal的精度可以修改的计算pi使用莱布尼茨级数计算圆周率fromdecimalimportDecimal,getcontext#设置全局精度为100位getcontext().prec=100#使用莱布尼茨级数计算圆周率pi=Decimal(0)forkinrange(1000000):pi+=(Decimal(-1)**k)/(......