下面介绍一下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)
}