github.com/bytedance/gopkg@v0.0.0-20240514070511-01b2cbcf35e1/util/gopool/gopool.go (about) 1 // Copyright 2021 ByteDance Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package gopool 16 17 import ( 18 "context" 19 "fmt" 20 "math" 21 "sync" 22 ) 23 24 // defaultPool is the global default pool. 25 var defaultPool Pool 26 27 var poolMap sync.Map 28 29 func init() { 30 defaultPool = NewPool("gopool.DefaultPool", math.MaxInt32, NewConfig()) 31 } 32 33 // Go is an alternative to the go keyword, which is able to recover panic. 34 // gopool.Go(func(arg interface{}){ 35 // ... 36 // }(nil)) 37 func Go(f func()) { 38 CtxGo(context.Background(), f) 39 } 40 41 // CtxGo is preferred than Go. 42 func CtxGo(ctx context.Context, f func()) { 43 defaultPool.CtxGo(ctx, f) 44 } 45 46 // SetCap is not recommended to be called, this func changes the global pool's capacity which will affect other callers. 47 func SetCap(cap int32) { 48 defaultPool.SetCap(cap) 49 } 50 51 // SetPanicHandler sets the panic handler for the global pool. 52 func SetPanicHandler(f func(context.Context, interface{})) { 53 defaultPool.SetPanicHandler(f) 54 } 55 56 // WorkerCount returns the number of global default pool's running workers 57 func WorkerCount() int32 { 58 return defaultPool.WorkerCount() 59 } 60 61 // RegisterPool registers a new pool to the global map. 62 // GetPool can be used to get the registered pool by name. 63 // returns error if the same name is registered. 64 func RegisterPool(p Pool) error { 65 _, loaded := poolMap.LoadOrStore(p.Name(), p) 66 if loaded { 67 return fmt.Errorf("name: %s already registered", p.Name()) 68 } 69 return nil 70 } 71 72 // GetPool gets the registered pool by name. 73 // Returns nil if not registered. 74 func GetPool(name string) Pool { 75 p, ok := poolMap.Load(name) 76 if !ok { 77 return nil 78 } 79 return p.(Pool) 80 }