プールパッケージ のインポート( "エラー" "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() リターンゼロ }
(Redisのをカプセル化するために、MQ接続プール)golangパッケージベースのチャネルリソースプール
おすすめ
転載: www.cnblogs.com/zipon/p/11315255.html
おすすめ
ランキング