【Python笔记-设计模式】对象池模式
一、说明
用于管理对象的生命周期,重用已经创建的对象,从而减少资源消耗和创建对象的开销
(一) 解决问题
主要解决频繁创建和销毁对象所带来的性能开销问题。如数据库连接、线程管理、网络连接等,对象的创建和销毁成本相对较高,如果频繁进行这些操作,会消耗大量的系统资源,并可能导致性能瓶颈。
(二) 使用场景
- 资源受限时,如果CPU性能不够强劲或内存比较紧张,垃圾收集和内存抖动可能会造成较大影响。在这种情况下,提高内存管理效率尤为重要,对象池模式可以帮助减少内存分配和再分配的成本,避免内存碎片。
 - 创建高成本对象时,对于那些创建成本较高的对象,如数据库连接、线程或网络连接,对象池模式可以显著减少创建和销毁这些对象的开销。
 - 频繁创建和销毁对象的场景,在需要频繁创建和销毁对象的场景中,如任务队列池、网络连接池等,对象池模式可以显著提高性能。
 
二、结构

- 对象池(ObjectPool):这是对象池模式的核心组件,负责创建、初始化和管理对象池中的对象。对象池持有一组已经初始化并且可以使用的对象,提供对外借出和归还对象的方法。
 - 抽象池化对象(IPooledObject):这是一个抽象接口或基类,定义了池化对象应该具备的基本操作和行为。它通常包括对象的状态管理(如是否在使用中、是否需要销毁等)和对象池相关的操作(如借出、归还等)。
 - 具体池化对象(ConcretePoolObject):这是实现了抽象池化对象的具体类,封装了池化对象的实际状态和行为。具体池化对象在被借出时提供给客户端使用,并在使用完毕后归还给对象池。
 - 客户端(Client):这是使用对象池模式的代码部分,通过向对象池请求对象来使用,并在使用完毕后将对象归还给对象池。客户端不需要关心对象的创建和销毁过程,只需要从对象池中获取对象并使用即可。
 
三、伪代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
对象池模式例:创建一个对象池,验证是否可以重用对象
"""import queue
import threadingclass ObjectPool:"""创建对象池,用于管理对象"""def __init__(self, object_type, max_size=10):self._lock = threading.Lock()self._objects = queue.Queue(max_size)self._object_type = object_typeself._max_size = max_sizedef acquire_object(self):"""从对象池中获取一个对象"""with self._lock:try:obj = self._objects.get(block=False)except queue.Empty:obj = self._object_type()return objdef release_object(self, obj):"""将一个对象归还给对象池"""with self._lock:try:self._objects.put(obj, block=False)except queue.Full:passclass MyObject:def __init__(self):pass@staticmethoddef do_something():print("Doing something...")if __name__ == '__main__':"""Doing something...4416796512Doing something...4416796512"""# 创建对象池object_pool = ObjectPool(MyObject, max_size=2)obj1 = object_pool.acquire_object()obj1.do_something()print(id(obj1))object_pool.release_object(obj1)obj2 = object_pool.acquire_object()obj2.do_something()print(id(obj2))object_pool.release_object(obj2)
 
四、优缺点
优点
- 性能提升,对象池模式通过重用对象,避免了频繁创建和销毁对象的开销,从而提高了系统的性能和响应速度。
 - 资源利用率提高,通过减少对象的创建和销毁,对象池模式降低了对系统资源的占用,如内存和CPU。
 - 减少内存抖动,对象池模式通过减少对象的频繁创建和销毁,有助于减少内存抖动,从而提高系统的稳定性。
 
缺点
- 复杂性增加,实现对象池模式需要额外的代码和逻辑来处理对象的借用、归还和同步等操作。(同步开销、对象状态管理)
 
跳转主页:【Python笔记】设计模式-CSDN博客
相关文章:
【Python笔记-设计模式】对象池模式
一、说明 用于管理对象的生命周期,重用已经创建的对象,从而减少资源消耗和创建对象的开销 (一) 解决问题 主要解决频繁创建和销毁对象所带来的性能开销问题。如数据库连接、线程管理、网络连接等,对象的创建和销毁成本相对较高,…...
反序列化 [NPUCTF2020]ReadlezPHP1
打开题目 直接查看源代码 打开源代码发现了个./time.php?source 访问一下 审计代码: 现存在反序列化语句:$ppp unserialize($_GET["data"]);和执行漏洞:echo $b($a); 发现在__destruct()方法里面有 echo $b($a); 这个是php的…...
AI技术那些事儿:揭开潜伏在你生活中的高科技小能手
你有没有发现,现在的生活里有些“看不见”的聪明家伙,它们时时刻刻在帮咱们忙活呢?从早上用语音命令打开窗帘、播报新闻,到晚上喊一声关灯睡觉,这些都离不开人工智能(简称AI)的助攻。今天咱就掰…...
使用向量数据库pinecone构建应用06:日志系统异常检测 Anomaly Detection
Building Applications with Vector Databases 下面是这门课的学习笔记:https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…...
抽象工厂模式 Abstract Factory
1.模式定义: 提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类 2. 应用场景: 程序需要处理不同系列的相关产品,但是您不希望它依赖于这些产品的 具体类时, 可以使用抽象工厂 3.优点: 1.可以确信你从工厂得到的产品彼…...
掌握 Android 中的 RecyclerView 优化
掌握 Android 中的 RecyclerView 优化 一、RecyclerView Pool以及何时使用它二、onCreateViewHolder 和 onBindViewHolder三、优化 RecyclerView 的不同方法四、视图无效与请求布局五、ViewHolder模式六、默认的废料和脏视图类型七、结论 RecyclerView 是 Android 中一个功能强…...
Android platform tool中d8.bat不生效
d8.bat因找不到java_exe文件,触发EOF d8.bat中之前代码为: set java_exe if exist "%~dp0..\tools\lib\find_java.bat" call "%~dp0..\tools\lib\find_java.bat" if exist "%~dp0..\..\tools\lib\find_java.bat" …...
WSL安装Ubuntu22.04,以及深度学习环境的搭建
安装WSL 安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能才能使用此功能。 以管理员身份打开 PowerShell 并运行: dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart下载 Linux 内核更…...
【PTA|选择题|期末复习】结构体
2-1 For the following declarations,assignment expression_is not correct. struct Student {long num;char name[28];}st1,st2{101,"Tom"},*p&st1; 〇 A.st1 st2 ◎ B.p->name st2.name O C p->num st2.num 〇 D,*pst2 2-2 下面定义结构变量的语…...
Video generation models as world simulators-视频生成模型作为世界模拟器
原文地址:Video generation models as world simulators 我们探索在视频数据上进行大规模生成模型的训练。具体来说,我们联合训练文本条件扩散模型,同时处理不同持续时间、分辨率和长宽比的视频和图像。我们利用一个在视频和图像潜在编码的时…...
高刷电竞显示器 - HKC VG253KM
今天给大家分享一款高刷电竞显示器 - HKC VG253KM。 高刷电竞显示器 - HKC VG253KM源于雄鹰展翅翱翔的设计灵感,严格遵循黄金分割比例的蓝色点晴线条,加上雾面工艺及高低起伏错落有致的线条处理,在VG253KM的背部勾勒出宛若大鹏展翅的鹰翼图腾…...
nginx-------- 高性能的 Web服务端 (三) 验证模块 页面配置
一、http设置 1.1 验证模块 需要输入用户名和密码 htpasswd 此命令来自于 httpd-tools 包,如果没有安装 安装一下即可 也可以安装httpd 直接yum install httpd -y 也一样 第一次生成文件htpasswd -c 文件路径 姓名 交互式生成密码 htpasswd -bc 文…...
Kafka是如何防止消息丢失的
Kafka通过一系列机制来防止消息丢失,主要包括以下几个方面: 生产者端(Producer)保证: 同步发送:生产者默认是异步发送消息的,但如果希望保证消息不丢失,可以选择将异步发送改为同步…...
[工具探索]VSCode介绍和进阶使用
相比较GoLand、PhpStorm、PyCharm、WebStorm的重量级内存占用,从Windows系统来,各种卡死,换到MacOS倒不会卡死,但是内存占用太多,影响体验,决定换到VSCode。当然这个过程需要适应过渡期,旧伙计都…...
Oracle迁移到mysql-表结构的坑
1.mysql中id自增字段必须是整数类型 id BIGINT AUTO_INCREMENT not null, 2.VARCHAR2改为VARCHAR 3.NUMBER(16)改为decimal(16,0) 4.date改为datetime 5.mysql范围分区必须int格式,不能list类型 ERROR 1697 (HY000): VALUES value for partition …...
【SpringCloudAlibaba系列--nacos配置中心】
Nacos做注册中心以及使用docker部署nacos集群的博客在这: 容器化部署Nacos:从环境准备到启动 容器化nacos部署并实现服务发现(gradle) 使用docker部署nacos分布式集群 下面介绍如何使用nacos做配置中心 首先要进行nacos-config的引入,引入…...
使用LinkedList实现堆栈及Set集合特点、遍历方式、常见实现类
目录 一、使用LinkedList实现堆栈 堆栈 LinkedList实现堆栈 二、集合框架 三、Set集合 1.特点 2.遍历方式 3.常见实现类 HashSet LinkedHashSet TreeSet 一、使用LinkedList实现堆栈 堆栈 堆栈(stack)是一种常见的数据结构,一端…...
springboot-cache+redis 为指定名称缓存设置独立超时时间
版本 spring-boot: 3.2.2 方案 注册 RedisCacheManagerBuilderCustomizer Bean对指定名称缓存进行定制 Bean RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {return builder -> builder.withCacheConfiguration(// Cacheable 注解使用的cac…...
Flutter 数据持久化存储之Hive
Flutter 数据持久化存储之Hive 前言正文一、配置项目二、UI① 增加UI② 显示和删除UI 三、使用Hive① 初始化Hive② TypeAdapter自定义对象③ 注册TypeAdapter③ CURD 四、源码 前言 在Flutter中,有多种方式可以进行数据持久化存储。以下是一些常见的方式࿱…...
Java中继承静态属性,方法,和非静态属性和方法的继承区别
结论: Java中静态属性和静态方法是可以被继承的,但是不可以被重写,而是被隐藏。 Java中非静态属性,可以被继承,但是不可以被重写,而是被隐藏。 Java中非静态方法,可以被继承,可以…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
