首页 > 其他分享 >golang实现分段协程数据查询、任务处理

golang实现分段协程数据查询、任务处理

时间:2024-10-13 17:19:02浏览次数:8  
标签:协程 分段 unitLimit int chan golang 执行 size

使用背景

我们经常遇到需要同时执行耗时的IO请求或数据处理等场景,需要用到协程来达到高效率,但又需要控制协程执行过程的量,防止资源过载,让效率和资源达到最优状态,这就是分段执行的价值。

一般实现的方式主要有两种:
1、需要获取执行结果,在协程内将执行结果写入chan,并在分段创建协程后,使用for循环从chan取出结果,当协程未执行完,则阻断,直到全部取出后再次创建下一分段协程任务。
2、无需获取执行结果,则可简化调用,使用sync.WaitGroup 控制协程分段执行。

1、通过chan获取执行结果实现
// Concurrency 并发处理数据、获取数据
// count     总记录数
// size      每次执行数
// unitLimit 单元并发数
// input     数据写chan
// output    获取chan数据
func Concurrency[T any](count int64, size int, unitLimit int, input func(page int, size int) T, output func(data T)) {
   

	ch := make(chan T, unitLimit)
	defer close(ch)
	pCount := int(math.Ceil(float64(count) / float64(size)))
	// 执行计数器,每次执行一个绥中周期消费
	stepRunCount := 0
	stepCount := int(math.Ceil(float64(pCount / unitLimit)))
	stepStateCount := 0
	for i := 0; i < pCount; i

标签:协程,分段,unitLimit,int,chan,golang,执行,size
From: https://blog.csdn.net/jamlin456/article/details/142900633

相关文章

  • golang从http请求中读取xml格式的body,并转成json
    推荐学习文档golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔记专栏文章目录以下是在Go语言中从HTT......
  • 【Golang】使用gob格式存储数据到redis
    目录1、背景2、gob和json对比3、go库下载4、代码示例【1】redis初始化【2】封装gob编码和解码方法【3】定义gob编码和解码的数据结构【4】gob编码【5】gob解码5、总结1、背景之前在压测大数据量的业务场景时,通过pprof分析cpu耗时,发现主要耗时在json序列化和反序列化......
  • zinx-Golang轻量级TCP服务器框架学习记录
    目录背景介绍学习资料源代码背景介绍由于工作需要,需要开发高并发的golang服务器。作为一个golang小白,选择一个好的框架既是对项目的负责,也是一个学习的过程。之所以选择Zinx框架,是因为其完整的文档和视频讲解,这对一个初学者来说是非常友好的学习资料Golang轻量级并发服务......
  • 【力扣150&Golang】分发糖果
    题目:分发糖果n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到1个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数目。示例......
  • 【力扣150&Golang】加油站
    题目:加油站在一条环路上有n个加油站,其中第i个加油站有汽油gas[i]升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组gas和cost,如果你可以按顺序绕环路行......
  • C程序设计:计算分段函数
    有一个函数:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪......
  • Golang上下文context
    上篇内容我们主要讲解了net/http标准库的使用,其中包含如何创建POST请求、GET请求以及如何携带参数的请求。Context介绍context释义为上下文,在我们使用goroutine时一般使用context来进行元数据的传递,非元数据不建议使用context来进行传递。那么我们主要是用context用来做什么呢?其......
  • Golang模板template
    背景概述当我们在进行json字段选取以及渲染时,我们经常会见到{{}},其实这就是我们今天要讲解的模板即是template。例如prometheusAlert中的模板就是使用了改语法。必备技能字段选取❝{{.}}表示json的所有域,例如:{"name":"anruo","age":18},我们使用{{.}}就可以获取到所有......
  • 28. 找出字符串中第一个匹配项的下标 Golang实现
    题目描述:给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbutsad",needle="sad"输出:0解释:"sad"在下标0和6处匹配。......
  • Golang 中的强大 TUI 库 ——tview
    在命令行界面下创建丰富的用户交互界面是许多开发者的需求,而Golang语言中有一个非常出色的TUI(文本用户界面)库——tview。本文将详细介绍tview库,并与其他流行的TUI库进行对比,最后进行总结。一、tview库介绍tview是一个用于创建终端用户界面的Golang库。它提供......