github.com/cristalhq/netx@v0.0.0-20221116164110-442313ef3309/connpool.go (about)

     1  package netx
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  )
     7  
     8  type ConnPool struct {
     9  	connCh chan net.Conn
    10  }
    11  
    12  func NewConnPool(addr string, size int) (*ConnPool, error) {
    13  	p := &ConnPool{
    14  		connCh: make(chan net.Conn, size),
    15  	}
    16  
    17  	for i := 0; i < size; i++ {
    18  		conn, err := net.Dial("tcp", addr)
    19  		if err != nil {
    20  			return nil, err
    21  		}
    22  		p.connCh <- conn
    23  	}
    24  	return p, nil
    25  }
    26  
    27  func (p *ConnPool) Acquire(ctx context.Context) (net.Conn, error) {
    28  	select {
    29  	case <-ctx.Done():
    30  		return nil, ctx.Err()
    31  	case conn := <-p.connCh:
    32  		return conn, nil
    33  	}
    34  }
    35  
    36  func (p *ConnPool) Release(conn net.Conn) {
    37  	p.connCh <- conn
    38  }