下面由golang教程栏目给大家介绍Golang连接池的几种实现案例,希望对需要的朋友有所帮助!
因为TCP的三次握手等等原因,建立一个连接是一件成本比较高的行为。所以在一个需要多次与特定实体交互的程序中,就需要维持一个连接池,里面有可以复用的连接可供重复使用。
而维持一个连接池,最基本的要求就是要做到:thread safe(线程安全),尤其是在Golang这种特性是goroutine的语言中。
实现简单的连接池type Pool struct { m sync.Mutex //保证多个goroutine访问时候,closed的线程安全 res chan io.Closer //连接存储的chan factory func() (io.Closer,error) //新建连接的工厂方法 closed bool //连接池关闭标志 }
这个简单的连接池,我们利用chan来存储池里的连接。而新建结构体的方法也比较简单:
func New(fn func() (io.Closer, error), size uint) (*Pool, error) { if size <= 0 { return nil, errors.New("size的值太小了。") } return &Pool{ factory: fn, res: make(chan io.Closer, size), }, nil }
只需要提供对应的工厂函数和连接池的大小就可以了。
获取连接
那么我们要怎么从中获取资源呢?因为我们内部存储连接的结构是chan,所以只需要简单的select就可以保证线程安全:
//从资源池里获取一个资源 func (p *Pool) Acquire() (io.Closer,error) { select { case r,ok := <-p.res: log.Println("Acquire:共享资源") if !ok { return nil,ErrPoolClosed } return r,nil default: log.Println("Acquire:新生成资源") return p.factory() } }
我们先从连接池的res这个chan里面获取,如果没有的话我们就利用我们早已经准备好的工厂函数进行构造连接。同时我们在从res获取连接的时候利用ok先确定了这个连接池是否已经关闭。如果已经关闭的话我们就返回早已经准备好的连接已关闭错误。
关闭连接池
那么既然提到关闭连接池,我们是怎么样关闭连接池的呢?
//关闭资源池,释放资源 func (p *Pool) Close() { p.m.Lock() defer p.m.Unlock() if p.closed { return } p.closed = true //关闭通道,不让写入了 close(p.res) //关闭通道里的资源 for r:=range p.res { r.Close() } }
这边我们需要先进行p.m.Lock()*上锁操作,这么做是因为我们需要对结构体里面的*closed进行读写。需要先把这个标志位设定后,关闭res这个chan,使得Acquire方法无法再获取新的连接。我们再对res这个chan里面的连接进行Close操作。
释放连接
释放连接首先得有个前提,就是连接池还没有关闭。如果连接池已经关闭再往res里面送连接的话就好触发panic。
func (p *Pool) Release(r io.Closer){ //保证该操作和Close方法的操作是安全的 p.m.Lock() defer p.m.Unlock() //资源池都关闭了,就省这一个没有释放的资源了,释放即可 if p.closed { r.Close() return } select { case p.res <- r: log.Println("资源释放到池子里了") default: log.Println("资源池满了,释放这个资源吧") r.Close() } }
消息,美国证券交易委员会委员Hester Peirce表示,Bitcoin Clarity Act预计将于今年夏天获得通过,目...
2 Paradex TVL从2.23亿美元暴跌至2300万美元消息,衍生品协议Paradex的总锁仓价值在代币推出后的数个月里,从1月下旬的峰值2.23亿美元暴...
3 XBIT DEX:深圳站世界杯预测活动圆满结束消息,XBIT DEX表示,深圳的预言家活动已圆满结束,镜头记录下了比赛的精彩瞬间、现场的热度...
4 伊朗议长说同时备战才好谈判消息,当地时间6月30日,伊朗首席谈判代表、议长卡利巴夫在接受采访时表示,伊朗决心维护...
5 Michael Saylor:数字信贷助力Strategy在熊市增消息,Michael Saylor表示,资本、信贷和货币结合可获得数万亿美元机会,数字信贷使Strategy今年...
6 Ouinex:交易平台解决加密市场结构性缺陷消息,Ouinex表示,其交易平台旨在解决现代加密市场的结构性缺陷。当前的加密交易环境高度...
7 《YMCA》主唱Victor Willis去世,曾为特朗普消息,据Village People官方社交媒体页面宣布,该乐队主唱Victor Willis已去世,享年74岁。这位出生...
8 亚马逊云科技将投入10亿美元设立全新A消息,亚马逊云科技于6月30日宣布,将投入10亿美元设立全新的人工智能部门,专门协助客户搭...
9 法国农业信贷银行推出欧元稳定币EURXT法国农业信贷银行Crdit Agr早期发行le宣布推出欧元稳定币EURXT,初期面向CACEIS的机构投资者客户...
10 特朗普在年度报告中披露个人加密收入超消息,特朗普在年度财务报告中披露其个人加密货币收入超过14亿美元。其中,来自其meme代币...
成都来彰科技 蜀ICP备2025134723号-1
资讯来源互联网,如有版权问题请联系管理员删除。