让消费数据处理更快版本2(有并发控制)-一次性并发获取或者初始化任务最快有效方式

简介: 让消费数据处理更快版本2(有并发控制)-一次性并发获取或者初始化任务最快有效方式

让消费数据处理更快版本2



一次性获取或者初始化所有数据并发模式


上个版本Go让消费速度更快我们重点有个LOOP,那就表明它是在后台一直运行的,那如果我们想一次性执行并发获取任务或者初始化任务,那该如何做呢?里面又有哪些需要注意的细节呢?show me the code,don‘t just say say!


代码


package main
import (
 "context"
 "fmt"
 "time"
)
// TaskRunner 运行task
type TaskRunner struct {
}
// Task 任务对象
type Task struct {
 Name  string
 Age  string
 IDCard  string
 Addr    string
}
func (taskRunner *TaskRunner)getConcurrency() int {
 //qps, _ := config.YAMLInt("qps") // 从配置文件获取qps
  qps := 5 //这里先写死 上线替换成从配置文件获取
 if qps <= 0 {
  return 5
 }
 return qps
}
func  (taskRunner *TaskRunner)Run(ctx context.Context, task Task) {
 // 这里你就可以对task做处理
 // 比如请求第三方接口
 // 比如插入数据
 // 比如通过task查询数据然后组装数据发送给kafka等消息队列
 // 比如发送通知等
 fmt.Println("消费结束", task.Name)
}
func (taskRunner *TaskRunner)initTask(ctx context.Context, tasks []Task) (interface{}, error) {
 if len(tasks) == 0 {
  return nil, nil
 }
 // 获取并发
 channelSize := taskRunner.getConcurrency()
 // 初始化并发pool
 pool := make(chan Task, channelSize)
 // 初始化并发goroutine
 for i := 0; i < channelSize; i++ {
  go func(id int) {
   start := time.Now()
   fmt.Println("初始化任务开始, runner_id=", id)
   for v := range pool { // 消费task
    taskRunner.Run(ctx, v)
   }
   fmt.Println("初始化任务结束, runner_id=", id, " duration=", time.Since(start))
  }(i)
 }
 // 塞数据
 go func() {
  for _, v := range tasks {
   pool <- v // 当然在往pool赛数据之前 你可以针对task v做些额外的初始化或者改变值行为 比如v.Addr="北京"改为v.Addr="上海"
  }
  close(pool)
 }()
 return tasks, nil
}
func main() {
 // 测试demo
 var tasks []Task
 for i:=0; i< 10; i++ {
  task := Task{
   Name: fmt.Sprintf("我是第%d个任务", i+1),
  }
  tasks = append(tasks, task)
 }
 runner := TaskRunner{}
 runner.initTask(context.Background(), tasks)
 time.Sleep(100*time.Second)
}


运行结果:


初始化任务开始, runner_id= 2
消费结束 我是第1个任务
消费结束 我是第2个任务
消费结束 我是第3个任务
消费结束 我是第4个任务
消费结束 我是第5个任务
消费结束 我是第6个任务
消费结束 我是第7个任务
消费结束 我是第8个任务
消费结束 我是第9个任务
消费结束 我是第10个任务
初始化任务结束, runner_id= 2  duration= 39.417µs
初始化任务开始, runner_id= 4
初始化任务结束, runner_id= 4  duration= 1.166µs
初始化任务开始, runner_id= 0
初始化任务开始, runner_id= 1
初始化任务开始, runner_id= 3
初始化任务结束, runner_id= 1  duration= 69.042µs
初始化任务结束, runner_id= 3  duration= 15.041µs
初始化任务结束, runner_id= 0  duration= 58.042µs


小结


这套模板主要是在web项目接口中或者说一直运行的异步任务中针对一次性初始化任务比较常见,大家可以拿来直接用,简单高效,欢迎有兴趣的同学一起交流哈。

相关文章
|
1天前
|
人工智能 安全 测试技术
|
3天前
|
云安全 人工智能 安全
阿里云 Agentic SOC 位居 IDC MarketScape安全运营智能体2026领导者类别
以 Agentic AI 重构安全运营闭环,阿里云云安全在产品能力与市场份额
1164 3
|
3天前
|
数据采集 机器学习/深度学习 人工智能
田间杂草定位与检测4200张YOLO智慧农业数据集分享
本数据集含4200张真实农田图像,YOLO格式,单类别(杂草)高质量标注,覆盖多作物、多光照、多生长阶段等复杂场景,专为智慧农业杂草检测与智能除草设备研发设计,支持YOLOv5/v8/v10等主流模型训练。
353 93
|
4天前
|
缓存 UED 开发者
Codex109天重置23次,明天还要再送一次
Codex近109天完成23次额度重置,7月14日将迎来第24次。Tibo高频响应用户反馈:优化GPT-5.6高消耗问题、补发失效福利、调整重置时间——形成“反馈→回应→修复→补偿”正向闭环,彰显以用户为中心的产品哲学。(239字)
591 11
|
7天前
|
存储 人工智能 JSON
Qwen 本地部署搭配 ComfyUI 生成 AI 漫剧完整实操指南(小白零基础可落地,零成本无限生成+角色一致性天花板)
2026全网最优本地漫剧流水线:零成本、离线运行、角色统一、低配(8G显卡)可跑。融合Qwen本地大模型+ComfyUI双引擎,实现剧本生成→分镜绘图→动态成片全自动,隐私安全、无审核限流,新手30分钟上手,日更无忧。(239字)
|
8天前
|
人工智能 缓存 JSON
刚刚 GPT-5.6 发布,吊打 Claude 5 和 Grok 4.5?一手实测来啦!
GPT-5.6 刚发布,跑分号称超越 Fable 5,真的假的?附一手实测,让 3 个最强 AI 编程模型 GPT-5.6 Sol、Claude Fable 5、Grok 4.5 在 Cursor 里同时一把梭开发网页游戏,看看最新模型到底谁更能打。
366 0