golang 实现协程池

本文介绍了如何在Go中利用goroutine和channel机制创建一个简单的协程池,以及讨论了协程池的不足,如缺乏动态扩展和拒绝策略。作者还推荐了一些相关阅读材料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

go 的 goroutine 提供了一种比线程而言更廉价的方式处理并发场景。相比线程,协程占据更小的内存空间,并且由于是在用户态进行调度,上下文切换的代价更小。所以协程更加容易支撑几万几百万的并发。但 goroutine 太多仍会导致调度性能下降、GC 频繁、内存暴涨, 引发一系列问题。

因此本文的目的是学习如何实现一个go协程池。
借鉴java的线程池,定义如下的结构体

type GoroutinePool struct {
   
	name     string
	coreSize uint32 //定义有多少协程
	taskChan chan func() //类似java的Runable中的run方法
	stop     bool //是否停止协程池
}

新建一个协程池,通过start方法启动协程。
使用select实现任务的执行和协程的销毁

func NewGoroutinePool(name string, coreSize uint32) *GoroutinePool{
   
	goroutinePool := &GoroutinePool{
   
		name:     name,
		coreSize: coreSize,
		taskChan: make(chan func()),
		stop:     false,
	}
	goroutinePool.start()
	return goroutinePool
}

func (pool *GoroutinePool) start() {
   
	for i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值