重庆人居建设集团网站,wordpress登录 美化,社区营销模式,1000禁用黄app软件排行构建的协程池实现两个目标#xff1a;
1、限制协程池里开启的协程数量
2、当任务数大于协程数时#xff0c;一个协程可以同时处理多个任务
3、监控是哪个协程ID处理了具体的任务
package mainimport (fmtruntimestrconvstring…构建的协程池实现两个目标
1、限制协程池里开启的协程数量
2、当任务数大于协程数时一个协程可以同时处理多个任务
3、监控是哪个协程ID处理了具体的任务
package mainimport (fmtruntimestrconvstringssyncgithub.com/panjf2000/ants/v2
)var goRoutineID []int64 make([]int64, 20)func printHelloWorld(i interface{}) {fmt.Println(hello,world:, i)//todo 记录当前的协程IDgid : getGID()goRoutineID append(goRoutineID, gid)}/*
*
获取协程ID
*
*/
func getGID() int64 {b : make([]byte, 64)b b[:runtime.Stack(b, false)]// fmt.Printf(%s, string(b))goidStr : strings.TrimPrefix(string(b), goroutine )goidStr goidStr[:strings.Index(goidStr, )]gid, err : strconv.ParseInt(goidStr, 10, 64)if err ! nil {return -1}return gid
}func main() {//关闭默认池defer ants.Release()//定义任务总数一个协程可以处理多个任务runTimes : 9var wg sync.WaitGroup//定义协程池容量100//定义任务函数:printHelloWorld//协程执行完成wg.Done让计数器减1操作p, _ : ants.NewPoolWithFunc(100, func(i interface{}) {printHelloWorld(i)wg.Done()})//关闭协程池释放工作队列defer p.Release()//定义任务函数的传参通过结构体的方式传参callParams : struct {name stringage int}{name: zhangsan,age: 44,}//todo 提交任务//Invoke参数将参数传递给任务函数//wg.Add计数器1for i : 0; i runTimes; i {wg.Add(1)_ p.Invoke(callParams)}//todo 阻塞等待所有的计数器清零wg.Wait()//p.Running 获取当前协程池执行工作的协程数量注意这个不等于协程池配置的数量比如当runTimes小于协程池配置的数量时这时候只需要开runTimes个协程就够了所以这里的值是runTimesfmt.Printf(running goroutines: %d\n, p.Running())//用map去重获取我们实际使用了哪些协程IDgoRoutineBool : make(map[int64]bool, 500)for _, v : range goRoutineID {goRoutineBool[v] true}fmt.Println(实际开启的协程ID:, goRoutineBool)}官方参考资料
https://github.com/panjf2000/ants https://pkg.go.dev/github.com/panjf2000/ants/v2v2.9.0#section-readme