多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> # 协程 (捕获异常 和 协程池) - Go 语言中的`goroutine`虽然相对于系统线程来说比较轻量级(初始栈大小仅`2KB`) - 但是在高并发量下的`goroutine`频繁创建和销毁对于性能损耗以及`GC`来说压力也不小。充分将`goroutine`复用,减少`goroutine`的创建/销毁的性能损耗,这便是`grpool`对`goroutine`进行池化封装的目的 - https://goframe.org/pages/viewpage.action?pageId=1114246 >### WorkerPool 定义一个工作池结构体 ~~~ package main import ( "fmt" "sync" ) // WorkerPool 定义一个工作池结构体 type WorkerPool struct { maxWorkers int taskQueue chan func() wg sync.WaitGroup } // NewWorkerPool 创建一个新的工作池 func NewWorkerPool(maxWorkers int) *WorkerPool { return &WorkerPool{ maxWorkers: maxWorkers, taskQueue: make(chan func()), } } // Start 启动工作池 func (wp *WorkerPool) Start() { for i := 0; i < wp.maxWorkers; i++ { go wp.worker() } } // worker 执行任务的工作者 goroutine func (wp *WorkerPool) worker() { for task := range wp.taskQueue { safeExecute(task) wp.wg.Done() } } // safeExecute 安全执行任务,捕获异常 func safeExecute(task func()) { defer func() { if r := recover(); r != nil { fmt.Println("Recovered from panic:", r) } }() task() } // Submit 提交任务到工作池 func (wp *WorkerPool) Submit(task func()) { wp.wg.Add(1) wp.taskQueue <- task } // Wait 等待所有任务完成 func (wp *WorkerPool) Wait() { wp.wg.Wait() close(wp.taskQueue) } ~~~ >### 任务 ~~~ package main import ( "fmt" "time" ) func main() { n := 0 //处理任务一 for i := 0; i < 10; i++ { SafeGo(func() { for { n += 1 time.Sleep(time.Second) } }) } SafeGo(func() { for { fmt.Println(n) time.Sleep(time.Second * 3) } }) time.Sleep(time.Hour) } var pool *WorkerPool func init() { pool = NewWorkerPool(200) pool.Start() } func SafeGo(f func()) { pool.Submit(f) } ~~~