(Redisのをカプセル化するために、MQ接続プール)golangパッケージベースのチャネルリソースプール

プールパッケージ
のインポート(
  "エラー" 
  "IO" 
  "同期" 
  "時間" 
 
VAR(
  ErrInvalidConfig = errors.New( "プールの設定を無効")
  ErrPoolClosed = errors.New( "プール"は休館)
 
(工場出荷時のFUNCを入力します)(IO .Closer、エラー)
 
型インタフェース{プールの
  取得()(io.Closer、エラー)//リソースへのアクセス
  リリース(io.Closer)エラー//リリースリソース
  を閉じる(io.Closer)エラー//リソース閉じ
  シャットダウン()エラー/ /閉鎖プール
} 
 
のstruct {GenericPool入力
  sync.Mutexを
  プールチャンio.Closer 
  maxOpenプール内のリソースの// INT最大数
  //リソースプールの現在の数numOpen int型
  リソースプールの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を<; I ++ { 
    近い、ERR:=工場()
    誤る場合= nilの{!
      続ける
    } 
    <p.pool -近い
  } 
  戻りPはnil
} 
 
FUNC(P * GenericPool)を取得()(io.Closer、エラー){ 
  場合p.closed { 
    リターンゼロ、ErrPoolClosed 
  } 
  {用
    近い、ERR = p.getOrCreate()
    ERRなら=ゼロ{!
      リターンゼロ、ERR 
    } 
    // TODO maxLifttime处理
    近いほど、ゼロを返す
  } 
} 
 
FUNC(P * GenericPool)getOrCreate()(io.Closer、エラー){ 
  {選択
  近い場合に:= <-p.pool: 近いゼロリターン
  :デフォルト
  } 
  pは。ロック()
  もしp.numOpen> = p.maxOpen { 
    近い:= <-p.pool 
    p.Unlock() 
    、近いゼロを返します
  } 
  //新建连接
  近い、ERR = p.factory()
  ERR IF!= nilの{ 
    p.Unlock()
    の戻りはnil、ERR 
  } 
  p.numOpen ++ 
  p.Unlock()
  クローサー、nilを返す
} 
 
単一の接続プールに//解放リソースを
FUNC(P * GenericPool)リリース(近いio.Closer) {エラー
  p.closed IF { 
    ErrPoolClosedを返す
  } 
  p.Lock()
  - p.pool <クローザー
  p.Unlock()
  リターンゼロ
} 
 
閉じる//単一のリソース
FUNC(P * GenericPool)閉じる(クローザーio.Closer){誤差
  P .lock()
  closer.Close()
  p.numOpen-- 
  p.Unlock()
  リターンゼロ
} 
 
接続プールを閉じる//は、すべてのリソースを解放 
    ErrPoolClosedを返します 
FUNC(P * GenericPool)シャットダウン( )エラー{
  {p.closed場合
  } 
  p.Lock()
  クローズ(p.pool)を
  近づけるため=レンジp.pool { 
    closer.Close()
    p.numOpen-- 
  } 
  p.closed =真
  p.Unlock()
  リターンゼロ
}

  ターン:https://www.jb51.net/article/134302.htm

おすすめ

転載: www.cnblogs.com/zipon/p/11315255.html
おすすめ