|
- package agent
-
- import (
- "fmt"
- sync "sync"
- )
-
- type PoolConfig struct {
- }
-
- type PoolClient struct {
- *Client
- owner *Pool
- }
-
- func (c *PoolClient) Close() {
- c.owner.Release(c)
- }
-
- type Pool struct {
- grpcCfg *PoolConfig
- shareds map[string]*PoolClient
- lock sync.Mutex
- }
-
- func NewPool(grpcCfg *PoolConfig) *Pool {
- return &Pool{
- grpcCfg: grpcCfg,
- shareds: make(map[string]*PoolClient),
- }
- }
-
- // 获取一个GRPC客户端。由于事先不能知道所有agent的GRPC配置信息,所以只能让调用者把建立连接所需的配置都传递进来,
- // Pool来决定要不要新建客户端。
- func (p *Pool) Acquire(ip string, port int) (*PoolClient, error) {
- addr := fmt.Sprintf("%s:%d", ip, port)
-
- p.lock.Lock()
- defer p.lock.Unlock()
-
- cli, ok := p.shareds[addr]
- if !ok {
- c, err := NewClient(addr)
- if err != nil {
- return nil, err
- }
- cli = &PoolClient{
- Client: c,
- owner: p,
- }
- p.shareds[addr] = cli
- }
-
- return cli, nil
-
- }
-
- func (p *Pool) Release(cli *PoolClient) {
- // TODO 释放长时间未使用的client
- }
|