当前位置:主页 > 聚焦 >

关于Golang连接池的几种实现案例

时间:2020-12-16 05:16:17

  

下面由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() } }

热点推荐
1 Cryptorank:2026年Q2预测市场未平仓合约规模

消息,据Cryptorank发布的2026年Q2预测市场报告,预测市场未平仓合约规模在6月底达到18亿美元,...

2 trader 49fokj出售800万枚ansem,错失238万美元

消息,据Lookonchain监测,trader 49fokj获得ansem空投800万枚ansem,在ansem市值为2600万美元时以20.7万美...

3 0x0ddf...a902:ETH空单浮亏扩大至287.67万美元

消息,地址pension-USDT.ETH的ETH空单浮亏已扩大至287.67万美元,亏损比例达到9.82%。该地址的均价...

4 美股大赢家:dram空单增持11654.40枚,当前

消息,dram空单增持11,654.40枚,约合759,230.00美元,持仓规模达到7,281,801.76美元,均价从64.88美元...

5 ESMA警告Polymarket:欧盟规则可能触发零售

消息,欧洲证券和市场管理局警告称,欧盟内提供的预测市场合约可能已符合现有金融规则,...

6 CZ:Michael Saylor对比特币行业的积极影响

消息,CZ表示,Michael Saylor对比特币行业绝对是一个净积极因素,称其为声誉良好的比特币死忠...

7 比特币多头头寸仍占主导,清算潜力达

消息,分析师指出,1个月的清算水平显示出有趣的现象。尽管短期内空头头寸已被清算,但多...

8 哥伦比亚总统佩特罗:特朗普此前

消息,哥伦比亚总统佩特罗:特朗普此前并不知道我被列入美国财政部海外资产控制办公室制...

9 沙特若进一步发动袭击

消息,也门胡塞武装:沙特若进一步发动袭击,将遭到针对沙特机场及重要利益目标的打击。...

10 巴基斯坦与特朗普家族加密项目签署谅解

巴基斯坦今年1月与特朗普家族加密项目World Liberty Financial关联方SC Financial Technologies签署谅解备...

成都来彰科技 蜀ICP备2025134723号-1

资讯来源互联网,如有版权问题请联系管理员删除。