【Python笔记-设计模式】对象池模式

一、说明

用于管理对象的生命周期,重用已经创建的对象,从而减少资源消耗和创建对象的开销

(一) 解决问题

主要解决频繁创建和销毁对象所带来的性能开销问题。如数据库连接、线程管理、网络连接等,对象的创建和销毁成本相对较高,如果频繁进行这些操作,会消耗大量的系统资源,并可能导致性能瓶颈。

(二) 使用场景

  • 资源受限时,如果CPU性能不够强劲或内存比较紧张,垃圾收集和内存抖动可能会造成较大影响。在这种情况下,提高内存管理效率尤为重要,对象池模式可以帮助减少内存分配和再分配的成本,避免内存碎片。
  • 创建高成本对象时,对于那些创建成本较高的对象,如数据库连接、线程或网络连接,对象池模式可以显著减少创建和销毁这些对象的开销。
  • 频繁创建和销毁对象的场景,在需要频繁创建和销毁对象的场景中,如任务队列池、网络连接池等,对象池模式可以显著提高性能。

二、结构

  1. 对象池(ObjectPool):这是对象池模式的核心组件,负责创建、初始化和管理对象池中的对象。对象池持有一组已经初始化并且可以使用的对象,提供对外借出和归还对象的方法。
  2. 抽象池化对象(IPooledObject):这是一个抽象接口或基类,定义了池化对象应该具备的基本操作和行为。它通常包括对象的状态管理(如是否在使用中、是否需要销毁等)和对象池相关的操作(如借出、归还等)。
  3. 具体池化对象(ConcretePoolObject):这是实现了抽象池化对象的具体类,封装了池化对象的实际状态和行为。具体池化对象在被借出时提供给客户端使用,并在使用完毕后归还给对象池。
  4. 客户端(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。
  • 减少内存抖动,对象池模式通过减少对象的频繁创建和销毁,有助于减少内存抖动,从而提高系统的稳定性。

缺点

  • 复杂性增加,实现对象池模式需要额外的代码和逻辑来处理对象的借用、归还和同步等操作。(同步开销、对象状态管理)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479807.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android基础Adapter适配器详解

一、概念 Adapter是后端数据和前端显示UI的适配器接口。常见的View如ListView、GridView等需要用到Adapter. BaseAdapter:抽象类,实际开发中继承这个类并且重写相关方法,用得最多的一个Adapter! ArrayAdapter:支持泛型…

【嵌入式学习】QT-Day1-Qt基础

笔记 https://lingjun.life/wiki/EmbeddedNote/20QT 毛玻璃登录界面实现:

发电机项目 2/19

MQTT 一.MQTT是什么? MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议…

掌握array_walk()函数:解锁PHP数组操作的神奇力量!

掌握array_walk()函数:解锁PHP数组操作的神奇力量! 在 PHP 开发过程中,我们经常需要对数组进行遍历和处理。array_walk() 函数是 PHP 函数库中的一个重要工具,它提供了一种便捷的方式来对数组中的每个元素执行自定义操作。本文将深…

java8的 lambda表达式到stream API总结备忘

文章目录 1. Lambda 表达式为什么使用 Lambda 表达式从匿名类到 Lambda 的转换Lambda 表达式语法语法格式一:无参,无返回值,Lambda 体只需一条语句语法格式二:Lambda 需要一个参数语法格式三:Lambda 只需要一个参数时&…

Windows 使设置更改立即生效——并行发送广播消息

目录 前言 1 遍历窗口句柄列表 2 使用 SendMessageTimeout 发送延时消息 3 并行发送消息实现模拟广播消息 4 修改 UIPI 消息过滤器设置 5 托盘图标刷新的处理 6 完整代码和测试 本文属于原创文章,转载请注明出处: https://blog.csdn.net/qq_5907…

单片机stm32智能鱼缸

随着我国经济的快速发展而给人们带来了富足的生活,也有越来越多的人们开始养鱼,通过养各种鱼类来美化居住环境和缓解压力。但是在鱼类饲养过程中,常常由于鱼类对水质、水位及光照强度有着很高的要求,而人们也由于工作的方面而无法…

【STM32】硬件SPI读写W25Q64芯片

目录 基础知识回顾: SPI外设简介 SPI框图 主模式全双工连续传输 非连续传输 初始化SPI外设 核心代码 - 交换一个字节 硬件接线图 Code 程序配置过程 MySPI.c MySPI.h W25Q64.c W25Q64.h W25Q64_Ins.h main.c 基础知识回顾: 【STM32】SP…

opencv安装介绍以及基本图像处理详解

文章目录 一、什么是OpenCV ?二. OpenCV 安装1. 下载地址2.安装命令:pip install opencv-python 三、图像基础1. 基本概念2. 坐标系3. 基本操作(彩色图片)(1)读取图片:cv2.imread( )&#xff08…

java中实体pojo对于布尔类型属性命名尽量别以is开头,否则 fastjson可能会导致属性读取不到

假如我们有一个场景,就是需要将一个对象以字符串的形式,也就是jsonString存到一个地方,比如mysql,或者redis的String结构。现在有一个实体,我们自己创建的,叫做CusPojo.java 有两个属性是布尔类型的&#x…

获取 Windows 系统托盘图标信息的最新方案(一)

目录 前言 1 获取系统托盘图标的一般方法 1.1 使用 TB_ 类消息的注意事项 1.2 代码编写和测试 1.3 技术的适用范围 2 深度分析系统托盘图标信息 2.1 分析 Shell_NotifyIcon 函数参数 2.2 分析 Shell_NotifyIcon 函数的内部细节 2.3 分析 WM_COPYDATA 消息 2.4 调用方…

Milvus数据库介绍

参考:https://www.xjx100.cn/news/1726910.html?actiononClick Milvus 基于FAISS、Annoy、HNSW 等向量搜索库构建,核心是解决稠密向量相似度检索的问题。在向量检索库的基础上,Milvus 支持数据分区分片、数据持久化、增量数据摄取、标量向量…