Go-semaphore信号量模式与并发控制的最佳实践

📅 2026/8/10 11:35:08
Go-semaphore信号量模式与并发控制的最佳实践
Go-semaphore信号量模式与并发控制的最佳实践文章导语信号量(Semaphore)是控制并发访问数量的经典原语。Go中虽然没有内置semaphore类型但channel和golang.org/x/sync/semaphore提供了优雅的信号量实现。一、Channel实现信号量// 创建容量为N的信号量sem:make(chanstruct{},10)// 获取sem-struct{}{}deferfunc(){-sem}()// 或select{casesem-struct{}{}:// 获取成功default:// 已满非阻塞}二、官方semaphore包importgolang.org/x/sync/semaphore// 加权信号量sem:semaphore.NewWeighted(100)// 获取1个权重sem.Acquire(ctx,1)// 获取多个权重sem.Acquire(ctx,10)// 释放sem.Release(1)三、实战场景// 1. 控制API并发调用funcBatchCall(ctx context.Context,urls[]string,concurrencyint){sem:semaphore.NewWeighted(int64(concurrency))for_,url:rangeurls{sem.Acquire(ctx,1)gofunc(ustring){defersem.Release(1)fetch(u)}(url)}}// 2. 控制数据库连接并发typePoolstruct{semchanstruct{}}func(p*Pool)Acquire(){p.sem-struct{}{}}func(p*Pool)Release(){-p.sem}四、全文总结无缓冲Channel作互斥锁有缓冲Channel作信号量semaphore.Weighted作加权限流。参考文献golang.org/x/sync/semaphoreGo Blog - Go Concurrency PatternsThe Little Go Book