【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中非静态方法,可以被继承,可以…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
