풀 패키지 가져 오기 ( "오류" "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 () 리턴 닐 }
golang 패키지 기반 채널 자원 풀 (레디 스를 캡슐화, MQ 연결 풀)
추천
출처www.cnblogs.com/zipon/p/11315255.html
추천
행