• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

GO瞬间并发数控制

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

    var wg2 sync.WaitGroup
    wg2.Add(nums)

    xc :=0
    parallelNum := plt.MaxParallel
    var waitCount int32 = 0

    for i:=0;i<nums*lll;i=i+lll  {

    begin:

        if i % 30 == 1 {
            tools.L2 <- msg
        }

        if i % 10 == 1 {
            mm := fmt.Sprintf("子任务%v开始执行",i+1)
            tools.L2 <- mm
        }

        currentParallelNum := atomic.LoadInt32(&plt.currentParallel)
        if i % 10 == 1 {
            mm := fmt.Sprintf("当前任务数%v,最大并发数%v",currentParallelNum,parallelNum)
            tools.L2 <- mm
        }


        if currentParallelNum > parallelNum {
            waitCount++
            if waitCount > plt.MaxWaitCount {    //等待超过一定次数后,就放开一次并行度
                parallelNum = plt.MaxParallel2

                mm := fmt.Sprintf("当前等待次数%v超过最大等待次数%v,开始将并行数从%v增加到%v",waitCount,plt.MaxWaitCount,plt.MaxParallel,plt.MaxParallel2)
                waitCount = 0

                //tools.LogLevelByConfigFile(mm,2)
                //tools.LogTask(mm,2)
                tools.L2 <- mm
            }else {
                if parallelNum != plt.MaxParallel {
                    parallelNum = plt.MaxParallel
                }
            }

            mm := fmt.Sprintf("当前并行度%v超过最大并行度%v,开始等待",currentParallelNum,parallelNum)
            //tools.LogLevelByConfigFile(mm,2)
            //tools.LogTask(mm,2)
            tools.L2 <- mm
            tools.SleepByMil(100)
            tools.SleepByRandMil(3000*common.SleepInterval)
            goto begin
        }


        xc++
        mm := fmt.Sprintf("第 %v 个协程开始运行",xc)
        tools.L2 <- mm

        endIndex := i + lll
        if endIndex > l {
            endIndex = l
        }

        lstNew := (*sourceDataList)[i:endIndex]
        go func(lst *[]map[string]string,wg *sync.WaitGroup) {
            for _,row :=  range *lst {
                atomic.AddInt32(&plt.currentParallel,1)
                rowMap(&row,&plt.CommonStruct)          //每行数据该如何处理的函数
                atomic.AddInt32(&plt.currentParallel,-1)
            }
            wg.Done()
        }(&lstNew,&wg2)

        tools.SleepByMil(100)
    }
    wg2.Wait()

 

在for循环中加入一个时间等待,否则的话,GO会在瞬间启动上千个并发,可能会直接把程序打死;

tools.SleepByMil(100)

 如果不加这个时间等待,代码中的超过指定并发数开始等待的控制,根据控制不住;


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go语言实现订单管理系统发布时间:2022-07-10
下一篇:
英语口语笔记B1-Unit06.社交活动-01-Where should we go for dinner发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap