go 语言第三方库parallel的并行使用

庄飞
2023-12-01

下面介绍一下go语言第三方库parallel的并行使用:
https://github.com/buptmiao/parallel中可以查看库的使用用例。

parallel是一个go语言并行程序库, 用于不改变现有接口声明前提下的业务聚合或者重构.
如果需要循环某一个函数(oneDBAlarmCodeAnaylse),只是参数不同(db, userinfo),则可以使用parallel,
它可以并行运行,极大提高运行速度。

SetMaxProcs()函数表明parallel只能使用所有可用CPU的一半。

结果results中就是函数oneDBAlarmCodeAnaylse返回的[]bson.M类型的数据,
它会把leng个[]bson.M数据存在[][]bson.M类型的results中。

func (this *PublicReport) ProvinceAlmCodeAlmTrendAddHour(userinfo bson.M) {
	SetMaxProcs()
	var err interface{}
	length := len(userinfo)
	p := parallel.NewParallel()
	pchild := make([]*parallel.Parallel, leng)
	results := make([][]bson.M, length)
	for i := 0; i < length; i++ {
		db := userinfo[i]
		pchild[i] = p.NewChild()
		pchild[i].Except(ExceptionHandler).SetReceivers(&err)
		pchild[i].Register(this.oneDBAlarmCodeAnaylse,db, userinfo).SetReceivers(&results[i])
	}
	p.Run()
	if nil != err {
		returnVal := make(bson.M)
		this.HandleErrorTwo(err.(error), "AlarmCodeAnaylse", returnVal)
	}
	log.Error("results", len(results), results)
}
func (this *PublicReport) oneDBAlarmCodeAnaylse(db string, userinfo bson.M) []bson.M {
	//业务处理代码省略
}
func SetMaxProcs() {
	maxCPU := runtime.NumCPU()
	halfCPU := int(0.5 * float32(maxCPU))
	if halfCPU < 1 {
		halfCPU = 1
	}
	runtime.GOMAXPROCS(halfCPU)
}
 类似资料: