golanglimit的簡單介紹

本文目錄一覽:

Golang中的限速器 time/rate

在高並發的系統中,限流已作為必不可少的功能,而常見的限流演算法有:計數器、滑動窗口、令牌桶、漏斗(漏桶)。其中滑動窗口演算法、令牌桶和漏斗演算法應用最為廣泛。

這裡不再對計數器演算法和滑動窗口作介紹了,有興趣的同學可以參考其它相關文章。

非常很好理解,就像有一個漏斗容器一樣,漏鬥上面一直往容器里倒水(請求),漏斗下方以 固定速率 一直流出(消費)。如果漏斗容器滿的情況下,再倒入的水就會溢出,此時表示新的請求將被丟棄。可以看到這種演算法在應對大的突發流量時,會造成部分請求棄用丟失。

可以看出漏斗演算法能強行限制數據的傳輸速率。

令牌桶演算法

從某種意義上來說,令牌演算法是對漏斗演算法的一種改進。對於很多應用場景來說,除了要求能夠限制數據的平均傳輸速率外,還要求允許某種程度的突發情況。這時候漏桶演算法可能就不合適了,令牌桶演算法更為適合。

令牌桶演算法是指一個固定大小的桶,可以存放的令牌的最大個數也是固定的。此演算法以一種 固定速率 不斷的往桶中存放令牌,而每次請求調用前必須先從桶中獲取令牌才可以。否則進行拒絕或等待,直到獲取到有效令牌為止。如果桶內的令牌數量已達到桶的最大允許上限的話,則丟棄令牌。

Golang標準庫中的限制演算法是基於令牌桶演算法(Token Bucket) 實現的,庫名為golang.org/x/time/rate

對於限流器的消費方式有三種,分別為 Allow()、 Wait()和 Reserve()。前兩種內部調用的都是Reserve() ,每個都對應一個XXXN()的方法。如Allow()是AllowN(t, 1)的簡寫方式。

主要用來限速控制並發事件,採用令牌池演算法實現。

使用 NewLimiter(r Limit, b int) 函數創建限速器,令牌桶容量為b。初始化狀態下桶是滿的,即桶里裝有b 個令牌,以後再以每秒往裡面填充 r 個令牌。

允許聲明容量為0的限速器,此時將會拒絕所有操作。

// As a special case, if r == Inf (the infinite rate), b is ignored.

有一種特殊情況,就是 r == Inf 時,此時b參數將被忽略。

Limiter 提供了三個主要函數 Allow, Reserve, 和 Wait. 大部分時候使用Wait。其中 AllowN, ReserveN 和 WaitN 允許消費n個令牌。

每個方法都可以消費一個令牌,當沒有可用令牌時,三個方法的處理方式不一樣

AllowN方法表示,截止在某一時刻,目前桶中數目是否至少為n個。如果條件滿足,則從桶中消費n個token,同時返回true。反之不消費Token,返回false。

使用場景:一般用在如果請求速率過快,直接拒絕請求的情況

輸出

當使用Wait方法消費Token時,如果此時桶內Token數量不足(小於N),那麼Wait方法將會阻塞一段時間,直至Token滿足條件。否則直接返回。

// 可以看到Wait方法有一個context參數。我們可以設置context的Deadline或者Timeout,來決定此次Wait的最長時間。

輸出

// 此方法有一點複雜,它返回的是一個*Reservation類型,後續操作主要針對的全是這個類型

// 判斷限制器是否能夠在指定時間提供指定N個請求令牌。

// 如果Reservation.OK()為true,則表示需要等待一段時間才可以提供,其中Reservation.Delay()返回需要的延時時間。

// 如果Reservation.OK()為false,則Delay返回InfDuration, 此時不想等待的話,可以調用 Cancel()取消此次操作並歸還使用的token

輸出

limit的所有用法是什麼?

1.set a limit to:為xx設置一個限制/極限

2.the limit of:xx的極限

3.without limit:沒有限制,無極限

4.limit sth to:將某物限制在xx範圍內

例如:1.她知道自己的許可權 She knows her limit.

2.我為了減肥,限定自己每天攝入1000卡的熱量

In order to lose weight, I limit my daily intake of calories to 1000. n. 限度;限制;界線 vt. 限制;限定 limit [‘limit] n. 1. 界限,界線,限度,極限,極點 2. [複數] 範圍;境界;領土 3. (漁、獵等的)限額;限量;限度 4. (一次下的)賭注限額 5. [the limit] [口語]使人惱怒或高興到極點的人(或事);叫人無法忍受的人(或事) 6. 【數學】 (數列的)極限 (函數的)極限 (定積分的)極限 vt. 1. 限制;限定(在一定範圍內): 例句: The teacher limited her to 800 words for her composition.

老師將她的作文限定在800字以內。 Class membership is limited to 20.

班級人數限定在20名以內。 2. 減少;削減: 例句: We should limit the expenses.

我們應該節省開支。 3. 【法律】確定;確切指派: 例句: to limit an estate over to someone

將一份產業判定給某人 近義詞: bound . restrict . 反義詞: widen . expand . 短語 1. be the limit[口語]太過分,叫人無法忍受;使人無法可想 [參見 That’s the limit.] 2. go beyond (或 over) the limit過分;超過限度 3. go the limit

a. [美國英語] b. 【體育】(球賽或拳擊賽等)打全場,賽完全局,打到規定的回數 c. 達到極限;達到最後階段;壞到無以復加的地步 d. 開始性交 4. have (或 know) (no) limits有(沒有)限度 5. off limits[美國英語] (尤指軍人)禁止入內;禁區 6. reach the limit of one’s resources山窮水盡 7. set a limit to對…加以限制;控制 8. That’s the limit.[口語]這實在太過分了。簡直令人忍無可忍。不能再忍了。 9. there is a limit (或 are limits) to…是有限的 10. to the (utmost) limit[美國英語]到極點,到了最大限度 11. within (one’s) limits在一定範圍內;適度地,有限度地 12. without limit無限地;無限制地

Go 限制同時執行的線程數

假設,現在有1w個任務,需要通過線程並發執行。如果直接執行,會把內存撐爆。需要讓這些任務一批一批執行。如果設定,每次最多同時執行10個任務。

需要用到通道channel,利用channel的limit,通過堵塞通道的方式,把進程堵住。

原創文章,作者:EYWG,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143409.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EYWG的頭像EYWG
上一篇 2024-10-19 16:43
下一篇 2024-10-19 16:43

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智慧,Python都扮演著重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28
  • 用Python實現簡單爬蟲程序

    在當今時代,互聯網上的信息量是爆炸式增長的,其中很多信息可以被利用。對於數據分析、數據挖掘或者其他一些需要大量數據的任務,我們可以使用爬蟲技術從各個網站獲取需要的信息。而Pytho…

    編程 2025-04-28
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27
  • Guava Limiter——限流器的簡單易用

    本文將從多個維度對Guava Limiter進行詳細闡述,介紹其定義、使用方法、工作原理和案例應用等方面,並給出完整的代碼示例,希望能夠幫助讀者更好地了解和使用該庫。 一、定義 G…

    編程 2025-04-27
  • 2的32次方-1:一個看似簡單卻又複雜的數字

    對於計算機領域的人來說,2的32次方-1(也就是十進位下的4294967295)這個數字並不陌生。它經常被用來表示IPv4地址或者無符號32位整數的最大值。但實際上,這個數字卻包含…

    編程 2025-04-27
  • 製作一個簡單的管理系統的成本及實現

    想要製作一個簡單的管理系統,需要進行技術選型、開發、測試等過程,那麼這個過程會花費多少錢呢?我們將從多個方面來闡述製作一個簡單的管理系統的成本及實現。 一、技術選型 當我們開始思考…

    編程 2025-04-27

發表回復

登錄後才能評論