当前位置: 首页 > news >正文

如何实现一个优雅的Go协程池

使用Go语言实现一个优雅的协程池

协程池主要用到channel和goroutine来实现,以下是构思过程:

  1. 首先,通过channel来作为任务队列,让worker从中获取任务执行,避免创建过多的goroutine,减少资源消耗。
  2. 然后,使用协程池来处理这些任务。

这样可以有效均摊协程的压力,以及合理的调配这些任务。

以下是通过使用协程池和不使用做了一个比较,这是代码实现。

package main

import (
	"context"
	"fmt"
	"sync"
	"time"
)

func main() {
	const (
		taskNums = 100
		gNums    = 10
	)
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()
	var wg sync.WaitGroup
	ch := make(chan int, 10)

	start := time.Now()

	for i := 0; i < gNums; i++ {
		wg.Add(1)
		go worker(ctx, i, ch, executeFunc, &wg)
	}

	for i := 1; i <= taskNums; i++ {
		ch <- i
	}
	close(ch)
	wg.Wait()
	fmt.Println(time.Since(start))

	// case
	singleThreadedStart := time.Now()
	for i := 1; i <= taskNums; i++ {
		executeFunc(-1, i)
	}

	fmt.Println(time.Since(singleThreadedStart))
}

func worker(ctx context.Context, id int, ch chan int, f func(int, any), wg *sync.WaitGroup) {
	defer wg.Done()
	for {
		select {
		case <-ctx.Done():
			fmt.Println("stop")
			return
		case task, ok := <-ch:
			if !ok {
				return
			}
			f(id, task)
			//time.Sleep(time.Second * 1)
		}
	}
}

func executeFunc(id int, task any) {
	fmt.Println("g_id:", id, "task:", task.(int))
}

测试结果:

531.9µs
18.2275ms
(fmt输出部分省略)
http://www.dtcms.com/a/109290.html

相关文章:

  • ORION:基于VLM引导动作生成的端到端框架——论文精度
  • 源码分析之Leaflet图层控制控件Control.Layers实现原理
  • 量子计算与人工智能的结合:未来科技的双重革命
  • 人工智能混合编程实践:C++ ONNX进行图像超分重建
  • 从零实现Json-Rpc框架】- 项目实现 - 服务端主题实现及整体封装
  • “清凉海岛·创享一夏” 海南启动旅游线路产品创意设计大赛
  • 【C语言】strstr查找字符串函数
  • 基于milvus安装--可视化工具 attu
  • PyQt6实例_A股日数据维护工具_子窗体
  • 深入理解浏览器的事件循环
  • CentOS7 安装Redis
  • HTML应用指南:利用POST请求获取三大运营商5G基站位置信息(二)
  • OpenCV第3课 图像的绘制以及基本操作
  • C++:继承+菱形虚拟继承的一箭双雕
  • Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central
  • 2025年嵌入式大厂春招高频面试真题及解析
  • 使用Deployment运行无状态应用
  • 前缀和 一维差分和二维差分 差分差分矩阵
  • php的动态扩展模块(php的缓存模块)
  • 创建python虚拟环境
  • 记录一下零零散散的的东西-ImageNet
  • 大模型——如何在本地部署微软的OmniParser V2
  • PyTorch复现线性模型
  • 大模型 PDF解析-MinerU
  • 容器适配器-stack栈
  • AV128音乐播放器
  • 【蓝桥杯】每日练习 Day21
  • 基于Transformer框架实现微调后Qwen/DeepSeek模型的非流式批量推理
  • Unity中优化绘制调用整理
  • set和map封装