golang mysql并发_Golang中的并发控制

本文介绍了如何在Go语言中实现类似Python的并发控制,限制同时运行的Goroutine数量。通过创建一个GoPool结构,利用通道(token channel)来限制并发数,实现了当令牌不足时Submit函数会阻塞,等待令牌释放。GoPool的Wait方法用于等待所有任务执行完毕。这种方式使得在gotasks等异步任务框架中限制并发变得简单且优雅。

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

之前我写过一篇博客介绍 Python中的并发控制。

Python的并发控制可以说很优雅,Java的也是类似的,那么,Go语言咋办?如果我也想实现类似的需求,例如:同时不超过8个goroutine 执行任务,那该咋办呢?我在写 gotasks 这个异步任务框架 就有这种需求,因此我 把Go的并发控制抽象成如下代码,以后就可以直接使用了:

package pool

type GoPool struct {

MaxLimit int

tokenChan chan struct{}

}

type GoPoolOption func(*GoPool)

func WithMaxLimit(max int) GoPoolOption {

return func(gp *GoPool) {

gp.MaxLimit = max

gp.tokenChan = make(chan struct{}, gp.MaxLimit)

for i := 0; i < gp.MaxLimit; i++ {

gp.tokenChan

}

}

}

func NewGoPool(options ...GoPoolOption) *GoPool {

p := &GoPool{}

for _, o := range options {

o(p)

}

return p

}

// Submit will wait a token, and then execute fn

func (gp *GoPool) Submit(fn func()) {

token :=

go func() {

fn()

gp.tokenChan

}()

}

// Wait will wait all the tasks executed, and then return

func (gp *GoPool) Wait() {

for i := 0; i < gp.MaxLimit; i++ {

}

close(gp.tokenChan)

}

func (gp *GoPool) size() int {

return len(gp.tokenChan)

}

来看看用法:

gopool := pool.NewGoPool(pool.WithMaxLimit(3))

defer gopool.Wait()

gopool.Submit(func() {//你的代码})

是不是也挺优美的?这里注意两点:gopool.Submit 在令牌不足时,会阻塞当前调用(因此Go runtime会执行其他不阻塞的代码)

gopool.Wait() 会等到回收所有令牌之后,才返回

这样就可以实现我们的需求了,例如并发3个Goroutine执行任务。

参考资料:

更多文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值