代码
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.Mutex
func 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
……
}