当前位置: 首页 > news >正文

lua对象池管理工具剖析

lua对象池管理工具剖析

  • 源码
    • 对象池创建函数
    • 对象获取机制
    • 对象回收机制
    • 池清理功能
  • 设计模式分析
    • 1. 对象池模式
    • 2. 享元模式
    • 内存管理策略
  • 垃圾回收优化
  • 使用场景分析
    • 1. 网络连接管理
    • 2. 游戏对象管理
    • 3. 数据库连接池
  • 与直接创建方案的对比

一个高效的对象池实现,通过对象复用来减少内存分配和垃圾回收压力,特别适合频繁创建销毁对象的场景

源码

-- object pool, from: https://github.com/treamology/pool.lualocal type, pairs, table, setmetatable = type, pairs, table, setmetatable 
local pool = {}
local poolmt = {__index = pool}function pool.create(newObject, poolSize, maxPoolSize)if type(newObject) ~= "function" thenreturn nilendpoolSize = poolSize or 16maxPoolSize = (maxPoolSize and maxPoolSize >= poolSize) and maxPoolSize or 2 * poolSizelocal freeObjects = {}for _ = 1, poolSize dotable.insert(freeObjects, newObject())endreturn setmetatable({freeObjects = freeObjects,newObject = newObject,maxPoolSize = maxPoolSize},poolmt)
endfunction pool:obtain()return #self.freeObjects == 0 and self.newObject() or table.remove(self.freeObjects)
endfunction pool:free(obj, ...)if not obj thenreturn falseendif #self.freeObjects < self.maxPoolSize thentable.insert(self.freeObjects, obj)endif obj.reset then obj.reset(obj, ...) endreturn true
endfunction pool:clear()for k in pairs(self.freeObjects) doself.freeObjects[k] = nilend
endreturn pool

对象池创建函数

function pool.create(newObject, poolSize, maxPoolSize)-- 参数验证:必须提供对象构造函数if type(newObject) ~= "function" thenreturn nilend-- 参数默认值设置poolSize = poolSize or 16maxPoolSize = (maxPoolSize and maxPoolSize >= poolSize) and maxPoolSize or 2 * poolSize-- 预分配对象池local freeObjects = {}for _ = 1, poolSize dotable.insert(freeObjects, newObject())end-- 返回池实例return setmetatable({freeObjects = freeObjects,newObject = newObject,maxPoolSize = maxPoolSize},poolmt)
end

对象获取机制

function pool:obtain()return #self.freeObjects == 0 and self.newObject() or table.remove(self.freeObjects)
end

执行逻辑:
在这里插入图片描述

对象回收机制

function pool:free(obj, ...)if not obj thenreturn falseend-- 检查池容量,避免无限增长if #self.freeObjects < self.maxPoolSize thentable.insert(self.freeObjects, obj)end-- 调用对象的reset方法进行清理if obj.reset then obj.reset(obj, ...) endreturn true
end

池清理功能

function pool:clear()for k in pairs(self.freeObjects) doself.freeObjects[k] = nilend
end

设计模式分析

1. 对象池模式

-- 使用示例
local function createConnection()return { id = math.random(1000),connected = false,reset = function(self)self.connected = falseend}
endlocal connectionPool = pool.create(createConnection, 10, 50)

2. 享元模式

通过对象复用,减少相似对象的创建开销

内存管理策略

策略实现方式优势
预分配初始化时创建固定数量对象减少运行时分配
动态扩展池空时自动创建新对象避免阻塞
容量限制maxPoolSize控制内存上限防止内存泄漏

垃圾回收优化

-- 传统方式:频繁创建销毁
for i = 1, 1000 dolocal obj = createObject()  -- 触发GCuse(obj)-- obj被销毁,GC压力大
end-- 对象池方式:复用对象
for i = 1, 1000 dolocal obj = pool:obtain()   -- 从池中获取use(obj)pool:free(obj)              -- 放回池中,无GC压力
end

使用场景分析

1. 网络连接管理

local socketPool = pool.create(function()return {fd = nil,status = "closed",reset = function(self)if self.fd thenself:close()endself.status = "closed"end,connect = function(self, host, port)-- 连接逻辑end}
end, 20, 100)

2. 游戏对象管理

local bulletPool = pool.create(function()return {x = 0, y = 0, velocity = 100,active = false,reset = function(self)self.x, self.y = 0, 0self.active = falseend}
end, 50, 200)

3. 数据库连接池

local dbPool = pool.create(function()local conn = mysql.connect(config)return {conn = conn,reset = function(self)-- 重置连接状态self.conn:ping()  -- 保持连接活跃end}
end, 5, 20)

与直接创建方案的对比

方面对象池直接创建
内存分配预分配+复用每次新建
GC压力极小频繁触发
初始化成本一次性每次都有
灵活性需要reset逻辑无需特殊处理
http://www.dtcms.com/a/494984.html

相关文章:

  • 网站建设选择什么系统好福建省建设工程执业注册管理中心网站
  • 桐庐建设局网站域名解析入口
  • 数据库flask访问
  • 每日Reddit AI信息汇总 10.17
  • 高可用、高性能、高扩展集群核心区别详解以及高可用介绍
  • 【Linux网络】初识网络,网络的基础概念
  • 手机端网站动效类怎么做seo搜索优化 指数
  • 递归与迭代——力扣101.对称二叉树
  • 中扬立库 × 宁波卡帝亚:小家电之乡的仓储革命,破解制造仓储瓶颈
  • Linux《网络基础》
  • 网络层(IP)
  • 近红外相机在半导体制造领域的应用
  • 网站制作 深圳信科网络公司对比网站
  • 百度旗下所有app列表温州seo排名优化
  • 怎样做让百度收录网站域名设计方案翻译
  • 【whistle】whistle的安装和代理配置
  • 智能油脂润滑系统:降低维护成本与提升生产效率的双赢之道
  • CC17-加油站
  • 【办公类-120-01】20251016 UIBOT下载小说做成docx
  • RestTemplate发送Post请求报错:414 URI Too Long
  • 热力图:从逸出数据到宏观模式识别
  • 解决 gf / gau 与 Oh-My-Zsh 别名冲突的两种办法
  • 开源链动2+1模式、AI智能名片与S2B2C商城小程序:社群经济的数字化重构路径
  • 【详解vtkVoxelContoursToSurfaceFilter】:从有序XY平面轮廓生成三维表面
  • 版本控制器Git
  • 网站版建设南通制作企业网站
  • 网站后台管理系统的重要技术指标收录快的门户网站
  • 降本增效:如何用RustFS将企业存储TCO降低50%?
  • 当AI遇到信息系统:以AI+用户推荐的标签生命周期为例——标签为什么需要“死亡“?
  • 数据结构入门 (九):线索的“寻路”指引 —— 详解线索二叉树