Golang模擬令牌桶進行對訪問的限流方式
更新時間:2021年04月27日 09:43:59 作者:鹿灝楷silves
這篇文章主要介紹了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簡易令牌桶算法實現(xiàn)
基本思路:
定義一個chan,chan大小為需要限制的qps大小,go一個協(xié)程啟動tick,每1000/qps時間在tick中寫入數(shù)值,啟動另一個協(xié)程,讀取chan中的值,如果讀取到chan中有值,則向下層接口發(fā)送請求。
代碼如下:
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 {
//收客戶請求,發(fā)送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)
}
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
golang gorm 計算字段和獲取sum()值的實現(xiàn)
這篇文章主要介紹了golang gorm 計算字段和獲取sum()值的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
GO中高效的將int轉(zhuǎn)換為string的方法與源碼
本文將從逐步介紹幾種在?Go?中將?int?轉(zhuǎn)換為?string?的常見方法,并重點剖析這幾種方法在性能上的特點,另外,還會重點介紹?FormatInt?高效的算法實現(xiàn),需要的朋友可以參考下2024-01-01

