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 <- truetime.Sleep(duration)}}()for <- contain {//如果上一个线程写入一个true,就会运行这个代码块fmt.Println('helllo world')}}
补充:golang简易令牌桶算法实现
基本思路:定义一个chan,chan大小为需要限制的qps大小,go一个协程启动tick,每1000/qps时间在tick中写入数值,启动另一个协程,读取chan中的值,如果读取到chan中有值,则向下层接口发送请求。
代码如下:package mainimport ( 'fmt' 'time' 'httpclient')var LEN int = 10func 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) }}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持优爱好网。如有错误或未考虑完全的地方,望不吝赐教。
相关文章:
1. 怎么让div+css兼容ie6ie7ie8ie9和FireFoxChrome等浏览器2. requestAnimationFrame使用示例详解3. 基于JavaScript实现图片裁剪功能4. React优雅的封装SvgIcon组件示例5. uniapp自定义验证码输入框并隐藏光标6. 详解JavaScript中原始数据类型Symbol的使用7. JavaScript深拷贝方法structuredClone使用8. uniapp 手机验证码输入框实现代码(随机数、倒计时、隐藏手机号码中间四位)可以直接使用9. 使用Node.js实现Clean Architecture方法示例详解10. Jquery使用原生AJAX方法请求数据