概述
上代码:
func (v *VideoParamTask) Execute() { ctx, cancel := context.WithTimeout(context.Background(), inspectionTimeout) defer cancel() now := gtime.Now() // 判断当前时间是否在巡检模板中 if !isTimeInTemplate(ctx, v.templateId, *now) { logger.Logf(ctx, logger.InspectionLogger, "当前时间不在巡检模板中,跳过本次巡检,巡检类型:%s,当前时间:%s,巡检模板ID:%d", v.Name(), now.String(), v.templateId) return } monitors, deviceMap, channelMap, err := getMonitorPointInfos(ctx, v.resource) if err != nil { logger.Logf(ctx, logger.InspectionLogger, "获取监控点信息失败,巡检类型:%s,err: %v", v.Name(), err) return } var wg sync.WaitGroup resultsCh := make(chan *do.InspectionVideoParam, len(monitors)) // 限制并发数,最多同时运行10个 goroutine semaphore := make(chan struct{}, 10) for _, monitor := range monitors { wg.Add(1) semaphore <- struct{}{} // 获取一个信号量 go func(monitorId int) { defer wg.Done() defer func() { <-semaphore }() // 释放信号量 res := processVideoParamInspection(ctx, monitorId, now, deviceMap, channelMap) resultsCh <- res }(monitor.Id) } // 所有巡检完成后关闭通道 go func() { wg.Wait() close(resultsCh) }() var results []*do.InspectionVideoParam for res := range resultsCh { results = append(results, res) } if len(results) == 0 { logger.Logf(ctx, logger.InspectionLogger, "没有视频参数巡检数据") return } _, err = dao.InspectionVideoParam.BatchInsert(ctx, results) if err != nil { logger.Logf(ctx, logger.InspectionLogger, "批量添加视频参数巡检数据失败,err: %v", err) } return }
代码中中最多同时运行10个 goroutine,这个10个限制可以根据获取cpu数量runtime.NumCPU()来定,或者根据os.Getenv("APP_CONCURRENCY_LIMIT")类似的环境变量配置来定义,这样可以适配跟多种类的服务器。
最后
以上就是名字长了才好记为你收集整理的golang批量巡检视频限制协程数量的全部内容,希望文章能够帮你解决golang批量巡检视频限制协程数量所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复