channel实现并发控制
前言
怎么用channel来控制并发呢?我们最直观的想法就是构造一个带缓存的channel,一个协程在执行前先往里面占一个坑,执行完后再释放这个坑位,这样一来始终只有固定数量的协程在同时执行,从而达到并发控制的效果。
实现
open-falcon里使用第三方包 github.com/toolkits/concurrent/semaphore 来实现这种效果,先上代码:
package main import( "fmt" "time" nsema "github.com/toolkits/concurrent/semaphore" //查看该源码,其实就是利用了channel来做并发控制 ) func main(){ concurrentNum := 2 //设置并发数2 sema := nsema.NewSemaphore(concurrentNum) for i:=0; i<8; i++ { sema.Acquire() //先占一个坑,往channel里写一个数据 go func(num int){ defer sema.Release() //释放坑位 fmt.Printf("%d, get sema, ok\n", num) time.Sleep(1*time.Second) }(i) } // keep alive time.Sleep(5*time.Second) }
结构体
type Semaphore struct { bufSize int channel chan int8 //带缓存的channel }
Acquire()方法
func (this *Semaphore) Acquire() { this.channel <- int8(0) //往cannel里写入一条数据 }
Release()方法
func (this *Semaphore) Release() { <-this.channel //从channel里拿出一条数据 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性