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

news2024/9/21 20:46:53

一、说明

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

(一) 解决问题

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

(二) 使用场景

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

二、结构

  1. 对象池(ObjectPool):这是对象池模式的核心组件,负责创建、初始化和管理对象池中的对象。对象池持有一组已经初始化并且可以使用的对象,提供对外借出和归还对象的方法。
  2. 抽象池化对象(IPooledObject):这是一个抽象接口或基类,定义了池化对象应该具备的基本操作和行为。它通常包括对象的状态管理(如是否在使用中、是否需要销毁等)和对象池相关的操作(如借出、归还等)。
  3. 具体池化对象(ConcretePoolObject):这是实现了抽象池化对象的具体类,封装了池化对象的实际状态和行为。具体池化对象在被借出时提供给客户端使用,并在使用完毕后归还给对象池。
  4. 客户端(Client):这是使用对象池模式的代码部分,通过向对象池请求对象来使用,并在使用完毕后将对象归还给对象池。客户端不需要关心对象的创建和销毁过程,只需要从对象池中获取对象并使用即可。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
对象池模式

例:创建一个对象池,验证是否可以重用对象
"""

import queue
import threading


class ObjectPool:
    """
    创建对象池,用于管理对象
    """

    def __init__(self, object_type, max_size=10):
        self._lock = threading.Lock()
        self._objects = queue.Queue(max_size)
        self._object_type = object_type
        self._max_size = max_size

    def acquire_object(self):
        """
        从对象池中获取一个对象
        """
        with self._lock:
            try:
                obj = self._objects.get(block=False)
            except queue.Empty:
                obj = self._object_type()
        return obj

    def release_object(self, obj):
        """
        将一个对象归还给对象池
        """
        with self._lock:
            try:
                self._objects.put(obj, block=False)
            except queue.Full:
                pass


class MyObject:
    def __init__(self):
        pass

    @staticmethod
    def do_something():
        print("Doing something...")


if __name__ == '__main__':
    """
    Doing something...
    4416796512
    Doing 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博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C 语言基本语法及实用案例分享

一、什么是 C 语言? C语言是一种较早的程序设计语言,诞生于1972年的贝尔实验室。1972 年,Dennis Ritchie 设计了C语言,它继承了B语言的许多思想,并加入了数据类型的概念及其他特性。C语言是一门面向过程的计算机编程语…

基于单片机和LabVIEW的多路数据采集系统设计

摘 要:以8位高速、低功耗微控制器STC12C5A60S2为硬件控制核心,以Labview为上位机软件开发平台,设计了一个多路数据采集系统。由下位机单片机对多路模拟信号量进行数据采集,通过串口将采集的模拟量信息上传到上位机,上位机Labview对采集的数据进行存储、显示及处理、分析…

Node.js中如何处理异步编程

在Node.js中,处理异步编程是至关重要的技能。由于Node.js的单线程执行模型,异步编程可以极大地提高程序的性能和响应速度。本文将介绍几种常见的异步编程处理方式,并附上示例代码,帮助您更好地理解和应用异步编程技术。 回调函数…

GitLab代码库提交量统计工具

1.说明 统计公司所有项目的提交情况,可指定分支和时间段,返回每个人的提交新增数、删除数和总数。 2.API 文档地址:http://公司gitlab域名/help/api/README.md 项目列表查询 返回示例: [{"id": 1, //项目ID"http…

软考29-上午题-【数据结构】-排序

一、排序的基本概念 1-1、稳定性 稳定性指的是相同的数据所在的位置经过排序后是否发生变化。若是排序后,次序不变,则是稳定的。 1-2、归位 每一趟排序能确定一个元素的最终位置。 1-3、内部排序 排序记录全部存放在内存中进行排序的过程。 1-4、外部…

TF-A之供应链威胁模型分析

目录 一、简介 二、TF-A 概述 2.1、TF-A 存储库 2.2、外部依赖 2.3、附加二进制文件 2.4、TF-A工具链 2.5、基础设施 三、TF-A数据流 四、攻击树 五、威胁评估与缓解 5.1、影响和可能性评级 5.2、威胁和缓解措施 六、附录 一、简介 软件供应链攻击旨在向软件产品…

《深入浅出 Spring Boot 3.x》预计3月份发版

各位,目前本来新书《深入浅出 Spring Boot 3.x》已经到了最后编辑排版阶段,即将在3月份发布。 目录: 现在把目录截取给大家: 主要内容: 本书内容安排如下。 ● 第 1 章和第 2 章讲解 Spring Boot 和传统 Spri…

IT资讯——全速推进“AI+鸿蒙”战略布局!

文章目录 每日一句正能量前言坚持长期研发投入全速推进“AI鸿蒙”战略 人才战略新章落地持续加码核心技术生态建设 后记 每日一句正能量 人总要咽下一些委屈,然后一字不提的擦干眼泪往前走,没有人能像白纸一样没有故事,成长的代价就是失去原来…

【东京都立大学主办多重会议奖项】第六届计算机通信与互联网国际会议

ICCCI 2024 - Hosted by Tokyo Metropolitan University, Japanhttps://www.iccci.org/ 会议简介 第六届计算机通信与互联网国际会议将于2024年6月14-16日在日本东京都立大学举行。ICCCI 2024由东京都立大学主办,华中师范大学和美国科学工程学会联合赞助、并得到了…

Curfew e-Pass 管理系统存在Sql注入漏洞 附源代码

免责声明:本文所涉及的信息安全技术知识仅供参考和学习之用,并不构成任何明示或暗示的保证。读者在使用本文提供的信息时,应自行判断其适用性,并承担由此产生的一切风险和责任。本文作者对于读者基于本文内容所做出的任何行为或决…

使用备份工具xtrabackup进行增量备份详细讲解

增量备份 第一次修改数据 mysql> insert into tb_user values (4,sxx,0); Query OK, 1 row affected (0.01 sec)mysql> select * from tb_user; ------------------- | id | name | sex | ------------------- | 1 | Tom | 1 | | 2 | Trigger | 0 | | …

深入学习TS的高阶语法(泛型、类型检测、内置工具)

文章目录 概要一.TS的类型检测1.鸭子类型2.严格的字面量类型检测 二.TS的泛型1.基本使用2.传递多个参数3.泛型接口4.泛型类5.泛型约束6.映射类型(了解) 三.TS的知识扩展1.模块的使用-- 内置类型导入 2.类型的查找3.第三方库的类型导入4.declare 声明文件…

深度学习中的样本分类:如何区分正样本、负样本、困难样本和简单样本?

深度学习中的样本分类:如何区分正样本、负样本、困难样本和简单样本? 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入…

思维导图教你工作日报怎么写?

工作日报撰写秘诀:轻松提升效率,让你的每一天都闪闪发光 在快节奏的现代工作中,如何高效地规划和管理工作任务成为了职场人士必须面对的挑战。思维导图作为一种强大的思维工具,正逐渐受到越来越多人的青睐。本文将探讨为什么使用…

MySQL 索引原理以及 SQL 优化

索引 索引:一种有序的存储结构,按照单个或者多个列的值进行排序。索引的目的:提升搜索效率。索引分类: 数据结构 B 树索引(映射的是磁盘数据)hash 索引(快速锁定内存数据)全文索引 …

opencv的图像上下、左右和对角线翻转—flip函数

在OpenCV中,flip函数用于翻转图像。你可以沿x轴、y轴或两者同时翻转图像。这个函数非常直接,可以用于创建镜像图像或旋转图像。 void flip(InputArray src, OutputArray dst, int flipCode);src:输入图像。 dst:翻转后的输出图像…

安卓系统和iOS系统的手机备忘录同步数据方法

在这个智能手机时代,安卓与iOS系统犹如两位王者,各自拥有庞大的用户群体。有人钟情于安卓的开放与多样,有人偏爱iOS的流畅与稳定。甚至,有些人为了满足不同需求,同时使用着两个系统的手机。我就是其中的一员。 工作中…

ELK 简介安装

1、概念介绍 日志介绍 日志就是程序产生的,遵循一定格式(通常包含时间戳)的文本数据。 通常日志由服务器生成,输出到不同的文件中,一般会有系统日志、 应用日志、安全日志。这些日志分散地存储在不同的机器上。 日志…

RAW 编程接口 TCP 简介

一、LWIP 中 中 RAW API 编程接口中与 TCP 相关的函数 二、LWIP TCP RAW API 函数 三、LwIP_Periodic_Handle函数 LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP支持函数,一般在 main函数的无限循环中调用,主要功能是为 LwIP各个模块提供…

LeetCode | 整数反转 C语言

Problem: 7. 整数反转 文章目录 思路解题方法Code结果 思路 运算部分 while(x > 0) {y x % 10;y * 10;x / 10; } y / 10;对于大于32位的数要用long int类型的变量保存用pow算-2的31次方和2的31次方-1。 解题方法 由思路得 Code int reverse(long int x){long int y …