Golang Ants 构建协程池

构建的协程池实现两个目标:

1、限制协程池里开启的协程数量

2、当任务数大于协程数时,一个协程可以同时处理多个任务

3、监控是哪个协程ID处理了具体的任务

Go 复制代码
package main

import (
	"fmt"
	"runtime"
	"strconv"
	"strings"
	"sync"

	"github.com/panjf2000/ants/v2"
)

var goRoutineID []int64 = make([]int64, 20)

func printHelloWorld(i interface{}) {

	fmt.Println("hello,world:", i)

	//@todo 记录当前的协程ID
	gid := 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 := 9

	var 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 string
		age  int
	}{
		name: "zhangsan",
		age:  44,
	}

	//@todo 提交任务
	//Invoke参数将参数传递给任务函数
	//wg.Add:计数器+1
	for i := 0; i < runTimes; i++ {
		wg.Add(1)
		_ = p.Invoke(callParams)
	}

	//@todo 阻塞等待所有的计数器清零
	wg.Wait()

	//p.Running 获取当前协程池执行工作的协程数量,注意这个不等于协程池配置的数量,比如当runTimes小于协程池配置的数量时,这时候只需要开runTimes个协程就够了,所以这里的值是runTimes
	fmt.Printf("running goroutines: %d\n", p.Running())

	//用map去重获取我们实际使用了哪些协程ID
	goRoutineBool := 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/v2@v2.9.0#section-readme

相关推荐
阿米亚波1 小时前
【C++ STL】std::unordered_multiset
开发语言·数据结构·c++·笔记·stl
我是唐青枫1 小时前
Java ReentrantLock 实战详解:比 synchronized 更灵活的可重入锁
java·开发语言
QH139292318801 小时前
# R&S ZNB43 ZNA43 ZNA67矢量网络分析仪
开发语言·网络·php
脚踏实地皮皮晨2 小时前
003003001_Grid控件
开发语言·windows·算法·c#·visual studio
十年磨剑走天涯2 小时前
C++ STL 容器操作复杂度速查表
开发语言·c++
万少2 小时前
DeepSeek-V4-Flash 正式版上线了,但这 3 个坑我帮你提前踩了
前端·javascript·后端
明月_清风2 小时前
🚀 Palantir Foundry 本体论实战:当 Ontology 从"知识图谱"进化为"企业操作系统"
前端·后端
always_TT2 小时前
【Python requirements.txt 依赖管理】
开发语言·python
15Moonlight2 小时前
C++进阶(09):特殊类设计
开发语言·c++
宁风NF2 小时前
JavaScript:网络请求与前端通信
开发语言·前端·javascript·网络·学习·ecmascript