主页 > 知识库 > Golang模拟令牌桶进行对访问的限流方式

Golang模拟令牌桶进行对访问的限流方式

热门标签:网站排名优化 呼叫中心市场需求 Linux服务器 AI电销 地方门户网站 服务外包 百度竞价排名 铁路电话系统

利用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简易令牌桶算法实现代码
  • 详解Golang实现请求限流的几种办法
  • golang高并发限流操作 ping / telnet
  • golang接口IP限流,IP黑名单,IP白名单的实例
  • Golang 限流器的使用和实现示例
  • Golang实现请求限流的几种办法(小结)

标签:黄山 湘潭 兰州 铜川 崇左 衡水 湖南 仙桃

巨人网络通讯声明:本文标题《Golang模拟令牌桶进行对访问的限流方式》,本文关键词  ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 收缩
    • 微信客服
    • 微信二维码
    • 电话咨询

    • 400-1100-266