go语言简单的并行控制方法

来源:互联网 发布:软件功能需求文档 编辑:程序博客网 时间:2024/06/05 18:32

代码

for gFinishCnt < gTotalCnt {//没有全部完成就一直执行,需要想好失败时也能够退出的逻辑。    sg := segList[i%gTotalCnt]    if time.Now().Sub(pTime).Seconds() >= 1 {        fmt.Printf("seg=%v asNum=%d i=%d/%d/%d/%d\n",            sg.seg, sg.asNum, i, gRuningCnt, gFinishCnt, gTotalCnt)        pTime = time.Now()    }//每秒打印一次。控制打印频率    //超过最大并行Thread数,则等待10ms    if gRuningCnt > MAX_RUNING_CMD {        time.Sleep(time.Second / 100)        continue    }    i++    //已经完成的Thread,直接返回    if (sg.asNum > 0) || (ASNUM_FAIL == sg.asNum) {        continue    }    if ASNUM_WAITING == sg.asNum {        if time.Now().After(sg.tStart.Add(time.Second * ((MAX_RUNING_CMD + 99) / 100))) {            //超时Thread的处理        }        continue    }    //启动一个新Thread去完成一个Task    //Task的初始化必须在本父线程中进行,否则会乱序    //因为go启动线程是有延时的。    sg.asNum = ASNUM_WAITING    addCnt(0, 1)//添加一个runing的thread    go asNumStatHandler(sg)}var lock sync.Mutexfunc addCnt(finishCnt, runingCnt int) {lock.Lock()defer lock.Unlock()gFinishCnt += finishCnt //完成Thread数gRuningCnt += runingCnt //running Thread数

}

//子线程执行Handler
func asNumStatHandler(seg *IpSeg_S) {
……
addCnt(1, -1) //finish的加1,running的减1
……
}

0 0