Go语言中使用 buffered channel 实现线程安全的 pool

概述

我们已经知道 Go 语言提供了 sync.Pool,但是做的不怎么好,所以有必要自己来实现一个 pool。

给我看代码:

代码如下:

type Pool struct {

  pool chan *Client

}

// 创建一个新的 pool

func NewPool(max int) *Pool {

  return &Pool{

    pool: make(chan *Client, max),

  }

}


// 从 pool 里借一个 Client

func (p *Pool) Borrow() *Client {

  var cl *Client

  select {

  case cl = <-p.pool:

  default:

    cl = newClient()

  }

  return cl

}


// 还回去

func (p *Pool) Return(cl *Client) {

  select {

  case p.pool <- cl:

  default:

    // let it go, let it go...

  }

}

现在不要使用 sync.Pool

相关推荐