Python设计模式:对象池
1. 什么是对象池设计模式?
对象池设计模式是一种创建型设计模式,主要用于管理和复用对象,以提高性能和资源利用率。它通过维护一个对象的集合(池),来避免频繁地创建和销毁对象,从而减少内存分配和垃圾回收的开销。对象池通常用于那些创建和销毁成本较高的对象,例如数据库连接、线程、网络连接等。
对象池的基本工作原理如下:
- 初始化:在对象池创建时,预先实例化一定数量的对象,并将它们放入池中。
- 获取对象:当需要使用对象时,从池中获取一个可用的对象。如果池中没有可用对象,则可以选择创建新的对象(如果池的大小没有达到上限)。
- 归还对象:使用完对象后,将其归还到池中,而不是销毁它。归还后,对象可以被标记为可用,以供下次使用。
- 管理对象:对象池可以管理对象的生命周期,包括创建、销毁、清理等操作。
对象池的优点:
- 性能提升:通过复用对象,减少了对象的创建和销毁次数,从而提高了性能。
- 资源管理:对象池可以有效管理资源,避免资源的浪费和过度使用。
- 控制对象数量:对象池可以限制同时存在的对象数量,防止系统过载。
对象池的缺点:
- 复杂性:实现对象池可能会增加系统的复杂性,特别是在管理对象的状态和生命周期时。
- 内存占用:如果对象池中的对象数量过多,可能会导致内存占用增加。
- 线程安全:在多线程环境中,需要确保对象池的线程安全,以避免竞争条件。
对象池通常用于以下场景:
- 数据库连接池:管理数据库连接的复用,避免频繁创建和销毁连接。
- 线程池:管理线程的复用,提高多线程程序的性能。
- 网络连接池:管理网络连接的复用,减少网络延迟和资源消耗。
- 图形对象池:在游戏开发中,管理图形对象(如精灵、粒子等)的复用。
class DatabaseConnection:def connect(self):print("Connecting to the database.")def disconnect(self):print("Disconnecting from the database.")class ConnectionPool:def __init__(self, size):self.pool = [DatabaseConnection() for _ in range(size)]self.available_connections = self.pool.copy()def get_connection(self):if self.available_connections:connection = self.available_connections.pop()connection.connect() # 连接时调用 connect 方法return connectionelse:print("No available connections.")return Nonedef release_connection(self, connection):connection.disconnect() # 释放连接时调用 disconnect 方法self.available_connections.append(connection)def available_count(self):return len(self.available_connections)# 客户端代码
if __name__ == "__main__":pool_size = 3pool = ConnectionPool(pool_size)# 测试获取连接print(f"Available connections: {pool.available_count()}")conn1 = pool.get_connection()print(f"Available connections after getting conn1: {pool.available_count()}")conn2 = pool.get_connection()print(f"Available connections after getting conn2: {pool.available_count()}")conn3 = pool.get_connection()print(f"Available connections after getting conn3: {pool.available_count()}")# 尝试获取超过池大小的连接conn4 = pool.get_connection() # 这将显示 "No available connections."# 释放连接if conn1:pool.release_connection(conn1)print(f"Available connections after releasing conn1: {pool.available_count()}")if conn2:pool.release_connection(conn2)print(f"Available connections after releasing conn2: {pool.available_count()}")if conn3:pool.release_connection(conn3)print(f"Available connections after releasing conn3: {pool.available_count()}")# 再次尝试获取连接conn5 = pool.get_connection()print(f"Available connections after getting conn5: {pool.available_count()}")
Available connections: 3
Connecting to the database.
Available connections after getting conn1: 2
Connecting to the database.
Available connections after getting conn2: 1
Connecting to the database.
Available connections after getting conn3: 0
No available connections.
Disconnecting from the database.
Available connections after releasing conn1: 1
Disconnecting from the database.
Available connections after releasing conn2: 2
Disconnecting from the database.
Available connections after releasing conn3: 3
Connecting to the database.
Available connections after getting conn5: 2
-
数据库连接类:
DatabaseConnection
类模拟数据库连接,提供connect
和disconnect
方法。 -
连接池类:
ConnectionPool
类管理数据库连接的池。它在初始化时创建一定数量的连接,并提供获取和释放连接的方法。 -
可用连接计数:
available_count
方法返回当前可用连接的数量,方便管理和监控连接池的状态。 -
客户端测试代码:在客户端代码中,创建连接池并测试获取和释放连接的功能。通过打印可用连接的数量,验证对象池的管理能力。
2. 示例 1:Python 自带线程池的操作示例
在 Python 中,concurrent.futures
模块提供了一个简单而强大的接口来管理线程池。通过 ThreadPoolExecutor
类,开发者可以轻松地并发执行任务。本文将通过一个具体的示例,展示如何使用 Python 自带的线程池来处理并发任务。
线程池是一种线程管理机制,它允许你创建一个线程的集合(池),并在需要时复用这些线程。通过使用线程池,可以避免频繁创建和销毁线程的开销,从而提高程序的性能和响应速度。
ThreadPoolExecutor
提供了一个高层次的接口来管理线程池。以下是一些基本操作:
- 创建线程池
- 提交任务
- 获取任务结果
- 使用上下文管理器
from concurrent.futures import ThreadPoolExecutor, as_completed
import time# 定义一个模拟耗时的任务
def task(n):print(f"Task {n} is starting.")time.sleep(n) # 模拟耗时操作print(f"Task {n} is completed.")return n * 2if __name__ == "__main__":# 创建一个线程池,最多允许 3 个线程同时执行with ThreadPoolExecutor(max_workers=3) as executor:# 提交多个任务futures = {executor.submit(task, i): i for i in range(1, 6)}# 获取任务结果for future in as_completed(futures):result = future.result()print(f"Result: {result}")
Task 1 is starting.
Task 2 is starting.
Task 3 is starting.
Task 1 is completed.
Task 4 is starting.
Result: 2
Task 2 is completed.
Task 5 is starting.Result: 4
任务 1、2 和 3 同时开始执行,因为线程池的最大线程数为 3。
当任务 1 完成后,线程池会继续执行任务 4 和 5。
每个任务的结果在完成后被打印出来。
-
导入模块:首先,我们导入
ThreadPoolExecutor
和as_completed
函数。as_completed
用于迭代已完成的任务。 -
定义任务:
task
函数模拟一个耗时的任务,接受一个参数n
,并在执行过程中打印任务的开始和完成信息。它还返回n * 2
作为结果。 -
创建线程池:使用
ThreadPoolExecutor
创建一个线程池,指定最大线程数为 3。 -
提交任务:使用字典推导式提交多个任务。
executor.submit(task, i)
将任务提交给线程池,并返回一个Future
对象。 -
获取结果:使用
as_completed
函数迭代已完成的任务。通过future.result()
获取每个任务的返回值,并打印结果。
相关文章:
Python设计模式:对象池
1. 什么是对象池设计模式? 对象池设计模式是一种创建型设计模式,主要用于管理和复用对象,以提高性能和资源利用率。它通过维护一个对象的集合(池),来避免频繁地创建和销毁对象,从而减少内存分配…...
【上海大学数据库原理实验报告】MySQL数据库的C/S模式部署
实验目的 掌握Linux环境下MySQL数据库的安装、初始化和基本配置。通过配置MySQL的网络通信,熟悉数据库的远程访问机制及其安全性要求。 实验内容 在腾讯云上租借两台服务器,打开3306端口以允许MySQL远程访问。 图 1 租到的服务器可在控制台观察其状态…...
deepseek快速生成简历
目录 一、需求二、模板例子 三、生成简历四、其他说明 一、需求 现在我准备跳槽到一家公司,这家公司已经发布了招聘需求,现在你想跳槽到这家公司,我们可以利用deepseek快速生成符合这家公司的简历内容。 二、模板 我们要进行指令明确的结构…...
什么是机器视觉3D无序堆叠抓取
机器视觉3D无序堆叠抓取是一种结合三维视觉感知、人工智能算法和机器人控制的技术,旨在从杂乱无序堆叠的物体中识别、定位并抓取目标物体。该技术广泛应用于工业自动化(如物流分拣、装配制造)、仓储管理、食品加工等领域,解决了传统二维视觉或固定规则堆叠场景下的抓取难题…...
Shell脚本中的字符串截取和规则变化
文章目录 前言if通配符判断if判断多个条件规则变化字符串的两个示例改变中间段数字改变末尾段数字 总结 前言 科技的发展会带来习惯的改变,特别是对于我们这批敲代码的,之前还积累一些奇巧淫技,想着在必要的时候卖弄一下,自从生成…...
云账号安全事件应急响应指南:应对来自中国IP的异常访问
在当今数字化时代,云服务已成为企业IT基础设施的核心。然而,随之而来的安全挑战也日益突出。本文将详细介绍当发现云账号被来自中国的IP地址异常利用时,应如何快速有效地响应,以确保账户安全并最小化潜在风险。 1. 确认异常活动 首先,我们需要确认是否真的发生了安全事件…...
python番外
#作者:允砸儿 #日期:乙巳青蛇年 三月廿五 在开始数据库的分享之前笔者简单写以下关于python的番外。笔者这块可能写的不是很好csdn上面有很多大佬,笔者仅以自己的思维和想法与大家分享以下。 安装必看 笔者在这里贴一个网址https://www.…...
Jetson Orin NX 16G 配置GO1强化学习运行环境
这一次收到了Jrtson Orin NX, 可以进行部署了。上一次在nano上的失败经验 Jetson nano配置Docker和torch运行环境_jetson docker-CSDN博客 本次的目的是配置cuda-torch-python38环境离机运行策略。 Jetson Orin NX SUPER 1. 烧录镜像 参考链接在ubuntu系统中安装sdk manag…...
Embedding与向量数据库__0422
thinking:做一个项目 1,业务背景,价值 2,方法,工具 3,实践(现有的代码,改写的代码) cursor编程有个cursor settings ->privacy mode隐私模式,但是只要连上…...
正向代理和反向代理
正向代理和反向代理是两种在不同场景下使用的代理技术,它们有以下区别: 目标和作用 正向代理 目标 :主要是为客户端服务,帮助客户端去访问外部网络资源。例如,企业内部网络中的员工可能需要访问互联网,但直…...
Android JNI开发中头文件引入的常见问题与解决方案,提示:file not found
Android JNI开发中头文件引入的常见问题与解决方案 问题场景(新手易犯错误) 假设你在开发一个JNI项目,想要实现一个线程安全的队列(SafeQueue),于是直接在cpp目录下创建了safe_queue.h文件,并开…...
三网通电玩城平台系统结构与源码工程详解(二):Node.js 服务端核心逻辑实现
本篇文章将聚焦服务端游戏逻辑实现,以 Node.js Socket.io 作为主要通信与逻辑处理框架,展开用户登录验证、房间分配、子游戏调度与事件广播机制的剖析,并附上多个核心代码段。 一、服务端文件结构概览 /server/├── index.js …...
案例:Windows 作为客户端免密验证(公钥验证)
一、实验前提 1.服务器端为 Linux 系统,且能够正常运行相关命令和服务,如 systemctl、ssh 服务等。同时,客户端为 Windows 系统,且具备使用 SSH 客户端工具连接到 Linux 服务器的条件 2.Linux 服务器上已安装并配置好 SSH 服务&…...
leetcode 二分查找
704. Binary Search 代码: class Solution { public:int search(vector<int>& nums, int target) {int n nums.size();int left 0;int right n-1;int res -1;while(left < right){int mid (leftright)/2;if(nums[mid] target){res mid;break;}…...
C++:STL模板
STL模板分为函数模板和类模板。 我想交换两个数字,但是类型不同,例如我想交换整形a,b,和double类型的d1,d2。如果使用C语言来实现,那么需要像下面一样写两个swap函数,但是除了类型不同,其它都一样…...
NumPy入门:从数组基础到数学运算
目录 一、NumPy 数组基础 (一)创建数组 (二)数组索引 (三)数组切片 二、数组操作 (一)形状操作 (二)数组合并与分割 三、基本数学运算 (…...
文档管理 Document Management
以下是关于项目管理中 文档管理 的深度解析,结合高项(如软考高级信息系统项目管理师)教材内容,系统阐述文档管理的理论框架、核心流程及实战应用: 一、文档管理的基本概念 1. 定义 文档管理是对项目全生命周期中产生的各类文档进行规范化管理的过程,包括创建、存储、版…...
TCP三次握手与四次挥手面试回答版本
面试官:说一下TCP三次握手的过程 参考面试回答: 在第一次握手的时候、客户端会随机生成初始化序号、放到TCP报文头部的序号字段中、同时把SYN标志设置为1 这样就表示SYN报文(这里是请求报文)。客户端将报文放入 TCP 报文首部的序…...
Windows7升级Windows10,无法在此驱动器上安装Windows
一、现象描述 台式机工作站,从Windows7升级Windows10,采用MediaCreationTool_22H2制作U盘启动盘,安装系统遇到问题如下: 二、原因分析 是由于硬盘格式不是GPT硬盘,而Windows系统只能安装到GPT硬盘上,所以…...
【阿里云大模型高级工程师ACP习题集】2.2 扩展答疑机器人的知识范围
练习题 【单选题】在RAG应用的建立索引过程中,文本向量化的主要目的是( )。 A. 将文本转换为计算机能理解的数字形式,便于比较相似度 B. 对文本进行分类 C. 去除文本中的噪声数据 D. 提取文本中的关键词 【多选题】以下属于RAG应用中建立索引步骤的有( )。 A. 文档解析 B…...
Mininet--node.py源码解析
算法逻辑详解 1. 核心类结构 代码通过面向对象的方式定义了网络模拟中的各类节点,继承关系如下: Node ├── Host │ └── CPULimitedHost ├── Switch │ ├── UserSwitch │ ├── OVSSwitch │ ├── OVSBridge │ └── IVSS…...
龙虎榜——20250422
指数目前还是震荡为主,等待后续的选择方向 2025年4月22日龙虎榜行业方向分析 一、核心主线方向 化工(新材料产能优化) • 代表标的:红宝丽(环氧丙烷/锂电材料)、亚太实业(农药中间体ÿ…...
掌握 Altium Designer:轻松定制“交换器件”工具栏
在PCB设计过程中,快速交换器件(如电阻、电容、IC等)是提高效率的关键。Altium Designer提供了灵活的工具栏定制功能,让用户可以创建专属的"交换器件"工具栏,将常用操作集中管理,减少菜单切换时间…...
npm的基本使用安装所有包,安装删除指定版本的包,配置命名别名
npm的基本使用安装所有包,安装删除指定版本的包,配置命名别名 安装所有依赖指定版本安装/删除包给 npm 脚本配置“命令别名(自定义命令)” ✅ 一、安装所有包(恢复依赖) 如果项目中已经存在 package.json…...
transformer预测寿命
完整的Transformer剩余寿命预测代码体系。该代码已在锂电池和工业设备数据集验证,支持端到端训练和预测。 python import torch import numpy as np from torch import nn, optim from sklearn.preprocessing import MinMaxScaler from torch.utils.data import Da…...
如何将视频轻松转换为GIF动态图
在社交媒体和日常聊天中,GIF动态图因其体积小、循环播放的特点而广受欢迎。很多人希望将视频中的精彩片段制作成GIF图分享给朋友或用于内容创作。本文将详细介绍如何简单快速地将视频转换为GIF动态图,无需复杂软件,几步即可完成。 转换步骤 …...
一文详解Pytorch环境搭建:Mac电脑pip安装Pytorch开发环境
对于希望在本地环境中进行深度学习开发的开发者来说,配置PyTorch工具是至关重要的一步。。对于Mac用户而言,搭建PyTorch开发环境并不复杂,本文将详细介绍如何在Mac电脑上使用pip安装PyTorch开发环境,帮助开发者快速上手深度学习开…...
ios开发中xxx.debug.dylib not found
问题描述:error: Build input file cannot be found: /Users/zhoutao/Library/Developer/Xcode/DerivedData/XfLive-effvxneriinvzwexohdsevonmhsk/Build/Products/Debug-iphoneos/xFLive.app/xFLive.debug,dylib’, pid you forget to declare this file as an out…...
Linux嵌入式系统SQlite3数据库学习笔记
前言 SQlite3是一个轻量级、嵌入式的关系型数据库管理系统,其中具有的核心特点: 1:嵌入式数据库:无需独立服务器进程,数据库直接嵌入到应用程序中。 2:单文件存储:整个数据库存储为单个文件&…...
【教程】安装 iterm2 打造漂亮且高性能的 mac 终端
【教程】安装 iterm2 打造漂亮且高性能的 mac 终端_mac 安装iterm2-CSDN博客 安装myzh 参考文章:https://blog.csdn.net/qq_44741467/article/details/135727124 下载地址:GitCode - 全球开发者的开源社区,开源代码托管平台 1、下载到本地 2、进入下载的…...
C++IO流
CIO流 IO: 向设备输入数据和输出数据 C的IO流设备: 文件、控制台、特定的数据类型(stringstream) c中,必须通过特定的已经定义好的类, 来处理IO(输入输出) 读写文件:文件流 文件流: 对文件进行读写操作 头文件: <fstream> 类库: ifstream 对文件输入&am…...
Swoole-添加自定义路由实现控制器访问
swoole本身不支持路由功能,默认情况我们实现路由访问可能要这样 $path $request->server[request_uri]switch ($path){case /favicon.ico:$response->status(404);$response->end(Not Found);break;case /abc/def/gg:$response->end("/abc/def/gg…...
Win10 关闭自动更新、关闭自动更新并重启
Windows 专业版及企业版用户可以通过组策略禁用或延迟更新。操作步骤如下: 按 Win R,输入 gpedit.msc 打开组策略编辑器。 导航到:计算机配置 > 管理模板 > Windows 组件 > Windows 更新。 修改以下设置: • 配置自…...
鸿道Intewell操作系统助力工业机器人控制系统自主可控
工业机器人与人形机器人的爆发式增长,正成为东土科技鸿道Intewell系统实现跨越式发展的核心引擎。从技术适配到生态重构,东土科技的三大核心能力与两大机器人赛道形成深度共振,其市场空间和产业地位将迎来指数级跃升。 一、工业机器人&…...
第十一届机械工程、材料和自动化技术国际会议(MMEAT 2025)
重要信息 官网:www.mmeat.net 时间:2025年06月23-25日 地点:中国-深圳 部分展示 征稿主题 智能制造和工业自动化 复合材料与高性能材料先进制造技术 自动化机器人系统 云制造与物联网集成 精密制造技术 智能生产线优化 实时数据分析与过…...
go语言八股文
1.go语言的接口是怎么实现 接口(interface)是一种类型,它定义了一组方法的集合。任何类型只要实现了接口中定义的所有方法,就被认为实现了该接口。 代码的实现 package mainimport "fmt"// 定义接口 type Shape inte…...
短视频广告创意策划简历模板
模板信息 简历范文名称:短视频广告创意策划简历模板,所属行业:其他 | 职位,模板编号:A4I63M 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到…...
2.Spring MVC与WebFlux响应式编程
目录 一、Spring MVC核心机制与工作原理 • 请求处理流程:DispatcherServlet分发机制、HandlerMapping与HandlerAdapter • 核心组件:ViewResolver、ModelAndView、拦截器(Interceptor) • 注解驱动开发:Controller、…...
【重走C++学习之路】16、AVL树
目录 一、概念 二、AVL树的模拟实现 2.1 AVL树节点定义 2.2 AVL树的基本结构 2.3 AVL树的插入 1. 插入步骤 2. 调节平衡因子 3. 旋转处理 4. 开始插入 2.4 AVL树的查找 2.5 AVL树的删除 1. 删除步骤 2. 调节平衡因子 3. 旋转处理 4. 开始删除 结语 一、概念 …...
蓝桥杯 19.合根植物
合根植物 原题目链接 题目描述 W 星球的一个种植园被分成 m n 个小格子(东西方向 m 行,南北方向 n 列)。每个格子里种了一株合根植物。 这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的…...
爆改 toxml 组件 支持数据双向绑定 解决数据刷新问题
GGGGGGGGGGGGGGGGGithub地址自行研究 sbfkcel/towxml: 微信小程序HTML、Markdown渲染库https://github.com/sbfkcel/towxml原组件是以导入数据渲染信息为目的、本文以AI数据返回小程序为模拟效果演示 默认情况只在ready 环节进行渲染静态资源 1、对传入数据容器的位置做处理 …...
6.分布式数据库与分库分表
目录 一、分库分表核心概念 • 核心目标:突破单库性能瓶颈,应对海量数据与高并发 • 垂直拆分:按业务模块拆分(用户库、订单库、商品库) • 水平拆分:单表数据分片(用户ID取模…...
基于javaweb的SSM+Maven小区失物招领系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
Kubernetes finalize | namespace卡Terminatingfinalizers删除失败
目录 1、为什么会卡住?2、强制删除卡住的 Namespace:操作步骤1:导出当前 namespace 信息2:启动代理(另一个终端)以便使用 Kubernetes API Server3:使用 curl 强制删除 finalize 3、进阶排查&…...
Java数组
目录 一、定义 二、使用 2.1遍历数组 2.2获取数组长度 三、Arrays类 3.1数组填充 3.2数组排序 3.3数组转为字符串 3.4数组比较 3.5二分搜索 3.6数组复制 二维数组 一、定义 数组表示一个相同类型元素的集合 对于一个数组,可以有以下几种定义方法 int[…...
高级java每日一道面试题-2025年4月22日-基础篇[反射篇]-如何通过反射创建一个对象实例?
如果有遗漏,评论区告诉我进行补充 面试官: 如何通过反射创建一个对象实例? 我回答: 在Java中,反射(Reflection)是一种强大的工具,允许程序在运行时检查和操作类、接口、字段和方法。反射不仅用于检查类的结构&#…...
Spring开发系列教程(26)——异步处理
在Servlet模型中,每个请求都是由某个线程处理,然后,将响应写入IO流,发送给客户端。从开始处理请求,到写入响应完成,都是在同一个线程中处理的。 实现Servlet容器的时候,只要每处理一个请求&…...
【2025最新Java面试八股】如何理解MySQL的MVCC机制?
面试回答要点 当面试官问及MySQL的MVCC机制时,可以这样组织回答: "MVCC(Multi-Version Concurrency Control,多版本并发控制)是MySQL实现高并发事务的一种重要机制,它通过保存数据在某个时间点的快照来实现非阻塞读操作。I…...
使用FreeRTOS解决单片机串口异步打印
单片机串口异步打印 文章目录 单片机串口异步打印前言设计思路准备队列创建完整代码 总结 前言 🌊在单片机开发中串口的异步打印异步打印允许单片机在执行其他任务的同时进行打印操作,无需等待打印完成后再继续执行后续代码,避免了在多处调用…...
飞算 JavaAI 与 Spring Boot:如何实现微服务开发效率翻倍?
微服务架构凭借其高内聚、低耦合的特性,成为企业构建复杂应用系统的首选方案。然而,传统微服务开发流程中,从服务拆分、接口设计到代码编写、调试部署,往往需要耗费大量时间与人力成本。Spring Boot 作为 Java 领域最受欢迎的微服…...