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) } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Go語言入門學習之Channel通道詳解
- Golang的select多路復用及channel使用操作
- golang 並發編程之生產者消費者詳解
- Go緩沖channel和非緩沖channel的區別說明
- 淺談golang 中time.After釋放的問題