您现在的位置是:网站首页> 编程资料编程资料
Golang模拟令牌桶进行对访问的限流方式_Golang_
2023-05-26
413人已围观
简介 Golang模拟令牌桶进行对访问的限流方式_Golang_
利用channel进行模拟令牌桶对访问进行限流
func FW(max int,duration time.Duration){ //定义一个channel ,进行初始化 contain := make(chan bool , max) for i := 0 ; i < max ; i ++{ contain <- true//写入channel } go func() {//开启一个线程 for { contain <- true time.Sleep(duration) } }() for <- contain {//如果上一个线程写入一个true,就会运行这个代码块 fmt.Println("helllo world") } } 补充:golang简易令牌桶算法实现
基本思路:
定义一个chan,chan大小为需要限制的qps大小,go一个协程启动tick,每1000/qps时间在tick中写入数值,启动另一个协程,读取chan中的值,如果读取到chan中有值,则向下层接口发送请求。
代码如下:
package main import ( "fmt" "time" "httpclient" ) var LEN int = 10 func tickStoreCh(arrlen int, ch chan int) { len := 1000/arrlen fmt.Println(len) tickTime := time.NewTicker(time.Duration(len)*time.Millisecond) var i int for { fmt.Println(len) i++ <-tickTime.C ch<- i } } func OrganReq(org string, qps int) { ch := make(chan int, qps) go tickStoreCh(qps, ch) time.Sleep(1000*time.Millisecond) for { //收客户请求,发送http请求给RE client := httpclient.NewHttpClient(time.Duration(1000)*time.Millisecond, time.Duration(2000)*time.Millisecond) header := make(map[string]string) header["Content-Type"] = "application/json;charset=utf-8" code, err := client.ResponseCode("http://127.0.0.1:19988", header, "llltest") value := <- ch fmt.Println(code, value, err, "lenchan:", len(ch)) //time.Sleep(time.Second) } } 以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
您可能感兴趣的文章:
相关内容
- Golang中的sync包的WaitGroup操作_Golang_
- go-kit组件使用hystrix中间件的操作_Golang_
- 利用go-kit组件进行服务注册与发现和健康检查的操作_Golang_
- Goland 断点调试Debug的操作_Golang_
- golang中的空slice案例_Golang_
- Go语言切片前或中间插入项与内置copy()函数详解_Golang_
- golang中切片copy复制和等号复制的区别介绍_Golang_
- go语言中切片与内存复制 memcpy 的实现操作_Golang_
- Go语言中的UTF-8实现_Golang_
- golang中实现给gif、png、jpeg图片添加文字水印_Golang_
