当前位置 博文首页 > Go语言中使用 buffered channel 实现线程安全的 pool

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

    作者:admin 时间:2021-02-09 12:02

    概述

    我们已经知道 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

    js
    下一篇:没有了