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

本文介绍了一种并发任务调度的实现方式,通过控制运行中的任务数量和已完成的任务数量来确保系统的稳定运行。同时,文章详细阐述了如何处理任务状态的变化,包括任务的启动、执行、完成以及超时等情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

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
……
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值