golang 패키지 기반 채널 자원 풀 (레디 스를 캡슐화, MQ 연결 풀)

풀 패키지 
가져 오기 ( 
  "오류" 
  "IO" 
  "동기화" 
  "시간" 
) 
 
VAR은 ( 
  ErrInvalidConfig = errors.New ( "풀 설정") 유효하지 않은 
  ErrPoolClosed = errors.New ( ")"휴일 풀 
) 
 
공장 FUNC를 (입력) (IO를 .Closer, 오류) 
 
유형 인터페이스의 {풀 
  획득 () (io.Closer, 오류) // 자원에 액세스 
  출시 (io.Closer) 오류 // 릴리스 자원 
  자원 닫습니다 // 닫기 (io.Closer) 오류 
  종료를 () 오류 / / 풀 근접 
} 
 
타입 GenericPool 구조체 {의 
  sync.Mutex 
  풀 찬 io.Closer 
  maxOpen의 INT // 풀 리소스의 최대 수 
  INT는 현재의 자원 풀의 수 // numOpen 
  자원 풀의 minOpen의 INT // 최소 개수
  // 닫힌 BOOL池是否已关闭 
    p.numOpen를 ++
  maxLifetime time.Duration의 
  공장 출하 //创建连接的方法
} 
 
NewGenericPool (minOpen, maxOpen의 INT, maxLifetime time.Duration 공장 출하) (* GenericPool 에러) {FUNC 
  경우 maxOpen <= 0 || minOpen> maxOpen { 
    복귀 닐, ErrInvalidConfig 
  } 
  : P = GenericPool { 
    maxOpen : maxOpen, 
    minOpen : minOpen, 
    maxLifetime : maxLifetime, 
    공장 : 공장 
    : 풀 (찬 io.Closer, maxOpen)를 만들 
  } 
 
  I에 대해 = 0; 난 minOpen를 <; {나는 ++ 
    = 공장 () 가까이, ERR 
    ! ERR = 전무는 {경우 
      계속 
    } 
    - 가까이 p.pool < 
  } 
  반환 P, 전무를 
} 
 
FUNC (p *에의 GenericPool) () {(io.Closer 에러)을 취득 
  p.closed 경우 { 
    복귀 닐, ErrPoolClosed 
  } 
  가 { 
    가까이 ERR = p.getOrCreate () 
    ! = 만약 ERR 무 { 
      복귀 닐, ERR 
    } 
    // TODO maxLifttime处理
    가까이 닐 반환 
  } 
} 
 
FUNC (p에 *를 GenericPool) getOrCreate ()는 (io.Closer가 에러) { 
  {선택 
  가까운 경우 =는 <-p.pool : 
    가까이 복귀 무기 호 
  기본값 : 
  } 
  p.Lock () 
  p.numOpen> = p.maxOpen가 {경우 
    더 가까이 = <-p.pool 
    p.Unlock () 
    가까이 반환 전무 
  } 
  //新建连接
  가까이, ERR : = p.factory () 
  ERR! = 무기 호 {IF 
    p.Unlock () 
    반환 전무, ERR 
  } 
  p.numOpen ++ 
  p.Unlock () 
  , 가까이 nil을 반환 
} 
 
단일 연결 풀에 // 출시 자원 
(P는 *의 GenericPool) FUNC 릴리스 ( 가까이 io.Closer ) {오류 
  p.closed 경우 { 
    ErrPoolClosed를 반환 
  } 
  ) (p.Lock를 
  - 가까이 p.pool < 
  p.Unlock () 
  반환 전무 
} 
 
// 닫기 단일 리소스 
FUNC (P는 *의 GenericPool) 닫기 ( 가까이 io.Closer) 오류 { 
  p.Lock () 
  closer.Close () 
  p.numOpen--의 
  p.Unlock () 
  반환 전무는 
} 
 
릴리스의 모든 자원, 연결 풀을 닫습니다 // 
(FUNC (P는 *의 GenericPool) 종료를 {) 오류
  {p.closed 경우 
    ErrPoolClosed을 반환
  } 
  p.Lock () 
  가까이 (p.pool) 
  가까이 대 = 범위 p.pool { 
    closer.Close () 
    p.numOpen--는 
  } 
  p.closed = TRUE 
  p.Unlock () 
  리턴 닐 
}

  십시오 : https://www.jb51.net/article/134302.htm

추천

출처www.cnblogs.com/zipon/p/11315255.html