go筆記 限速器 limiter

2022-03-18 14:24:00 字數 1787 閱讀 1511

參考: 

"golang.org/x/time/rate"

golang 提供上述包 用來對速度進行限制

limter限制時間的發生頻率,採用令牌池的演算法實現。這個池子一開始容量為b,裝滿b個令牌,然後每秒往裡面填充r個令牌。

由於令牌池中最多有b個令牌,所以一次最多只能允許b個事件發生

limter提供三中主要的函式 allow, reserve, and wait. 大部分時候使用wait。

首先建立乙個rate.limiter,其有兩個引數,第乙個引數為每秒發生多少次事件,第二個引數是其快取最大可存多少個事件。

//

例如: 每秒產生200*cpu個數個令牌,最多儲存200*cpu個數個令牌。

limiter = rate.newlimiter(rate.limit(200.numcpu()), 200*runtime.numcpu())

rate.limiter提供了三類方法用來限速

allow

func (lim *limiter) allow() bool

//allow 是函式 allown(time.now(), 1)的簡化函式。

func (lim *limiter) allown(now time.time, n int) bool

//allown標識在時間now的時候,n個事件是否可以同時發生(也意思就是now的時候是否可以從令牌池中取n個令牌)。如果你需要在事件超出頻率的時候丟棄或跳過事件,就使用allown,否則使用reserve或wait.

reserve

func (lim *limiter) reserve() *reservation

//reserve是reserven(time.now(), 1).的簡化形式。

func (lim *limiter) reserven(now time.time, n int) *reservation

//reserven 返回物件reservation ,標識呼叫者需要等多久才能等到n個事件發生(意思就是等多久令牌池中至少含有n個令牌)。

//如果reserven 傳入的n大於令牌池的容量b,那麼返回false.

使用樣例如下:

r := lim.reserven(time.now(), 1

)if !r.ok()

time

.sleep(r.delay())

act()

如果希望根據頻率限制等待和降低事件發生的速度而不丟掉事件,就使用這個方法。 

我認為這裡要表達的意思就是如果事件發生的頻率是可以由呼叫者控制的話,可以用reserven 來控制事件發生的速度而不丟掉事件。如果要使用context的截止日期或cancel方法的話,使用waitn。

wait

//

wait是waitn(ctx, 1)的簡化形式。

func (lim *limiter) wait(ctx context.context) (err error)

func (lim *limiter) waitn(ctx context.context, n int

) (err error)

//waitn 阻塞當前直到lim允許n個事件的發生。

//- 如果n超過了令牌池的容量大小則報錯。

//- 如果context被取消了則報錯。

//- 如果lim的等待時間超過了context的超時時間則報錯。

redis示例 限速器,計時器

incr key 將key中儲存的數字值增一。如果key不存在,那麼key的值會先被初始化為0,然後再執行 incr 操作。如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回乙個錯誤。本操作的值限制在 64 位 bit 有符號數字表示之內。這是乙個針對字串的操作,因為 redis 沒有專用...

小公尺路由器怎麼限速 小公尺路由器給裝置限速的教程

由於家裡的無線路由器有很szvcwddv多人在使用,但大家都用它來 或看電影了這樣就影響到我正常的工作了,那麼我們有沒有辦法來限制一些人的速度呢,下面就看一下如何限速吧 1 開啟瀏覽器在電腦中位址列輸入頁面,如圖所szvcwddv示 2 輸入管理員密碼後,在首頁會顯示實時網速,及連線小公尺路由器的終...

在路由器上面按IP限速

it168技術 2811路由器來完成,本實驗分兩種方法來做,各有特點。先看下路由器的flash yourname dir directory of flash 1 rw 25438028 oct 22 2010 02 25 58 00 00 c2800nm ipbase mz.124 15.t.bi...