上代码:
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批量巡检视频限制协程数量内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复