我是靠谱客的博主 名字长了才好记,最近开发中收集的这篇文章主要介绍golang批量巡检视频限制协程数量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

上代码:

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批量巡检视频限制协程数量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(27)

评论列表共有 0 条评论

立即
投稿
返回
顶部