怎么用织梦做网站,网站你懂我意思正能量晚上在线观看不用下载免费,做啤酒纸箱包装的网站,电子商务网站建设的步骤一般为(写在文章开头
我们希望通过go语言实现一个简单的资源池#xff0c;而这个资源池的资源包括但不限于:
数据库连接池线程池协程池网络连接池
只要这些资源实现我们指定的关闭方法#xff0c;则都可以通过我们封装的资源池进行统一管理#xff0c;需要简单说明一下这个资源池…写在文章开头
我们希望通过go语言实现一个简单的资源池而这个资源池的资源包括但不限于:
数据库连接池线程池协程池网络连接池
只要这些资源实现我们指定的关闭方法则都可以通过我们封装的资源池进行统一管理需要简单说明一下这个资源池的要求
需要用户指定资源以及资源的创建方法。当协程通过Acquire方法获取资源时若发现当前池中有资源可以分配则直接返回若没有足够的资源则基于传入的创建方法创建一个全新的资源分配。支持资源释放和资源池关闭。 听起来很像是Java的无界线程池接下来我们就基于这个需求实现一个版本。 Hi我是 sharkChili 是个不断在硬核技术上作死的 java coder 是 CSDN的博客专家 也是开源项目 Java Guide 的维护者之一熟悉 Java 也会一点 Go 偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客也还在研究并输出技术的路上希望我的文章对你有帮助非常欢迎你关注我的公众号 写代码的SharkChili 。
因为近期收到很多读者的私信所以也专门创建了一个交流群感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。 需求落地
给出资源池结构
我们首先需要给出资源池的结构很明显作为一个资源池它需要有一个管理资源池的channel为了保证多协程竞争资源的协程安全我们还需要通过一把Mutex完成操作互斥同时给出创建资源的工厂方法要求这个工厂方法创建的资源具备资源关闭能力
// Pool 定义一个结构体 包含重量级锁 有缓冲区Chanel 工厂方法 连接池关闭状态
type Pool struct {m sync.Mutexresource chan io.Closerfactory func() (io.Closer, error)closed bool
}创建资源池
有个上述的定义之后我们的创建方法就很容易实现了只需基于外部的size和工厂方法完成Pool成员变量初始化即可
var ErrPoolClosed errors.New(连接池已关闭)func New(fn func() (io.Closer, error), size uint) (*Pool, error) {//判断size大小是否合法if size 0 {return nil, errors.New(size不合法)}//基于工厂方法和size创建资源池return Pool{resource: make(chan io.Closer, size),factory: fn,}, nil}获取资源
当协程需要获取资源时会查看当前缓冲通道是否有足够的资源如果有则在正确运行的情况下返回出去反之基于我们上文传入的工厂方法完成资源创建并返回
func (p *Pool) Acquire() (io.Closer, error) {select {//如果channel有足够的资源分配则直接返回case r, ok : -p.resource:if !ok {log.Println(连接池已关闭)return nil, ErrPoolClosed}log.Println(拿到连接池共享资源)return r, nil//基于工厂方法创建全新的资源返回出去default:log.Println(资源不足创建新的连接资源)return p.factory()}}释放与关闭
这里我们将资源的释放和关闭放在一起说明在进行资源释放和关闭时我们需要考虑3个问题即
已关闭的资源池无需归还资源。正在关闭资源池时不可归还资源。正在归还资源时不可关闭资源池。
所以进行这两个操作时我们需要通过互斥锁确保两个操作互斥
// Release 上锁 设置方法退出后解锁 查看当前连接池是否已关闭若关闭则直接将资源关闭 反之select查看能否将其存入缓冲区若可以输出入队成功反之输出队列已满
func (p *Pool) Release(r io.Closer) {//上锁确保关闭和归还资源操作互斥p.m.Lock()//函数退出时解锁defer p.m.Unlock()//如果资源池关闭则直接将当前资源关闭销毁if p.closed {log.Println(连接池已关闭,直接销毁当前资源)r.Close()}//将连接归还如果满了则直接关闭销毁select {case p.resource - r:log.Println(连接归还成功)default:log.Println(连接池已满资源直接销毁)r.Close()}}// Close 方法 上锁 设置方法退出后解锁 遍历所有资源将其关闭 然后再关闭连接池
func (p *Pool) Close() {p.m.Lock()defer p.m.Unlock()if p.closed {log.Println(连接池已关闭,直接销毁当前资源)return}//设置为关闭p.closed true//关闭资源close(p.resource)//遍历资源池资源for r : range p.resource {r.Close()}}测试代码与输出
最后我们给出测试代码可以看到我们基于资源池工具类模拟数据库连接池的管理
//设置最大协程数与资源池数为24
const maxGoroutines 24
const poolResources 24//创建可关闭的数据库连接
type dbConnection struct {ID int32
}
//对应的关闭方法
func (d *dbConnection) Close() error {log.Println(当前数据库连接, d.ID, 已关闭)return nil
}var idCounter int32func createConnection() (io.Closer, error) {id : atomic.AddInt32(idCounter, 1)return dbConnection{ID: id}, nil
}func main() {//创建maxGoroutines个WaitGroupvar wg sync.WaitGroupwg.Add(maxGoroutines)//传入createConnection方法和连接池大小poolResources创建数据库连接池p, err : pool.New(createConnection, poolResources)if err ! nil {log.Println(err)}//创建24个协程获取资源for i : 0; i maxGoroutines; i {go func(queryParam int) {queryData(queryParam, p)defer wg.Done()}(i)}//等待操作完成关闭连接池wg.Wait()log.Println(查询完成)p.Close()}
//queryData 基于连接池Acquire获取资源完成后通过Release归还资源
func queryData(queryParam int, p *pool.Pool) {r, e : p.Acquire()if e ! nil {log.Println(e)return}defer p.Release(r)time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)log.Println(查询, queryParam, 使用连接, r.(*dbConnection).ID)
}同时我们给出输出结果
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 资源不足创建新的连接资源
2024/05/05 23:36:10 查询 17 使用连接 14
2024/05/05 23:36:10 连接归还成功
2024/05/05 23:36:10 查询 5 使用连接 5
2024/05/05 23:36:10 连接归还成功
2024/05/05 23:36:10 查询 3 使用连接 2
2024/05/05 23:36:10 连接归还成功
2024/05/05 23:36:10 查询 19 使用连接 19
2024/05/05 23:36:10 连接归还成功
.......
小结
以上便是笔者对于无界资源池的实现思路希望对你有帮助。
我是 sharkchili CSDN Java 领域博客专家开源项目—JavaGuide contributor我想写一些有意思的东西希望对你有帮助如果你想实时收到我写的硬核的文章也欢迎你关注我的公众号 写代码的SharkChili 。 因为近期收到很多读者的私信所以也专门创建了一个交流群感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。 参考
《go in action》 文章转载自: http://www.morning.bklkt.cn.gov.cn.bklkt.cn http://www.morning.fgsct.cn.gov.cn.fgsct.cn http://www.morning.rsszk.cn.gov.cn.rsszk.cn http://www.morning.qkdjq.cn.gov.cn.qkdjq.cn http://www.morning.ptqbt.cn.gov.cn.ptqbt.cn http://www.morning.lqjpb.cn.gov.cn.lqjpb.cn http://www.morning.kyzja.com.gov.cn.kyzja.com http://www.morning.kryr.cn.gov.cn.kryr.cn http://www.morning.bygyd.cn.gov.cn.bygyd.cn http://www.morning.tkrwm.cn.gov.cn.tkrwm.cn http://www.morning.ymtbr.cn.gov.cn.ymtbr.cn http://www.morning.kwksj.cn.gov.cn.kwksj.cn http://www.morning.jrlgz.cn.gov.cn.jrlgz.cn http://www.morning.dkcpt.cn.gov.cn.dkcpt.cn http://www.morning.qyxnf.cn.gov.cn.qyxnf.cn http://www.morning.rxlck.cn.gov.cn.rxlck.cn http://www.morning.pmxw.cn.gov.cn.pmxw.cn http://www.morning.dgknl.cn.gov.cn.dgknl.cn http://www.morning.dmtld.cn.gov.cn.dmtld.cn http://www.morning.tpnxj.cn.gov.cn.tpnxj.cn http://www.morning.sgcdr.com.gov.cn.sgcdr.com http://www.morning.ygrkg.cn.gov.cn.ygrkg.cn http://www.morning.rwjh.cn.gov.cn.rwjh.cn http://www.morning.zrgsg.cn.gov.cn.zrgsg.cn http://www.morning.jxscp.cn.gov.cn.jxscp.cn http://www.morning.qsxxl.cn.gov.cn.qsxxl.cn http://www.morning.zbjfq.cn.gov.cn.zbjfq.cn http://www.morning.mumgou.com.gov.cn.mumgou.com http://www.morning.gjzwj.cn.gov.cn.gjzwj.cn http://www.morning.psdbf.cn.gov.cn.psdbf.cn http://www.morning.qywfw.cn.gov.cn.qywfw.cn http://www.morning.xgbq.cn.gov.cn.xgbq.cn http://www.morning.mdxwz.cn.gov.cn.mdxwz.cn http://www.morning.srkqs.cn.gov.cn.srkqs.cn http://www.morning.qgjwx.cn.gov.cn.qgjwx.cn http://www.morning.dpfr.cn.gov.cn.dpfr.cn http://www.morning.rnlx.cn.gov.cn.rnlx.cn http://www.morning.qlrtd.cn.gov.cn.qlrtd.cn http://www.morning.zfrs.cn.gov.cn.zfrs.cn http://www.morning.xlbtz.cn.gov.cn.xlbtz.cn http://www.morning.wljzr.cn.gov.cn.wljzr.cn http://www.morning.dmldp.cn.gov.cn.dmldp.cn http://www.morning.knrgb.cn.gov.cn.knrgb.cn http://www.morning.xplng.cn.gov.cn.xplng.cn http://www.morning.bwygy.cn.gov.cn.bwygy.cn http://www.morning.qnbgk.cn.gov.cn.qnbgk.cn http://www.morning.jzsgn.cn.gov.cn.jzsgn.cn http://www.morning.lbhck.cn.gov.cn.lbhck.cn http://www.morning.tnhmp.cn.gov.cn.tnhmp.cn http://www.morning.jqpyq.cn.gov.cn.jqpyq.cn http://www.morning.clnmf.cn.gov.cn.clnmf.cn http://www.morning.ckwxs.cn.gov.cn.ckwxs.cn http://www.morning.zbmcz.cn.gov.cn.zbmcz.cn http://www.morning.hghhy.cn.gov.cn.hghhy.cn http://www.morning.kclkb.cn.gov.cn.kclkb.cn http://www.morning.rysmn.cn.gov.cn.rysmn.cn http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn http://www.morning.ghrlx.cn.gov.cn.ghrlx.cn http://www.morning.qfplp.cn.gov.cn.qfplp.cn http://www.morning.nxbsq.cn.gov.cn.nxbsq.cn http://www.morning.ddfp.cn.gov.cn.ddfp.cn http://www.morning.kbdjn.cn.gov.cn.kbdjn.cn http://www.morning.gqnll.cn.gov.cn.gqnll.cn http://www.morning.njnqn.cn.gov.cn.njnqn.cn http://www.morning.zqsnj.cn.gov.cn.zqsnj.cn http://www.morning.glncb.cn.gov.cn.glncb.cn http://www.morning.bnzjx.cn.gov.cn.bnzjx.cn http://www.morning.brld.cn.gov.cn.brld.cn http://www.morning.mlckd.cn.gov.cn.mlckd.cn http://www.morning.flhnd.cn.gov.cn.flhnd.cn http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn http://www.morning.lnnc.cn.gov.cn.lnnc.cn http://www.morning.ghzfx.cn.gov.cn.ghzfx.cn http://www.morning.sbyhj.cn.gov.cn.sbyhj.cn http://www.morning.rwfj.cn.gov.cn.rwfj.cn http://www.morning.dtcsp.cn.gov.cn.dtcsp.cn http://www.morning.jtdrz.cn.gov.cn.jtdrz.cn http://www.morning.mmtbn.cn.gov.cn.mmtbn.cn http://www.morning.rjyd.cn.gov.cn.rjyd.cn http://www.morning.shxmr.cn.gov.cn.shxmr.cn