亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用“golang.org/x/time/rate”的速率限制函數 40/秒

使用“golang.org/x/time/rate”的速率限制函數 40/秒

Go
12345678_0001 2023-06-12 15:17:02
我正在嘗試使用“golang.org/x/time/rate”來構建一個函數,該函數會阻塞直到令牌可用。這是使用庫將代碼塊速率限制為每秒 40 個請求的正確方法嗎,桶大小為 2。type Client struct {    limiter        *rate.Limiter    ctx context.Context}func NewClient() *Client {    c :=Client{}    c.limiter = rate.NewLimiter(40, 2)    c.ctx = context.Background()    return &c}func (client *Client) RateLimitFunc() {    err := client.limiter.Wait(client.ctx)    if err != nil {        fmt.Printf("rate limit error: %v", err)    }}為了限制我調用的代碼塊RateLimitFunc()我不想使用自動收報機,因為我希望速率限制器考慮調用代碼運行的時間長度。
查看完整描述

2 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

可以看到 to 的第一個參數NewLimiter是 type?rate.Limit。

如果您想要 40 個請求/秒,那么這將轉化為每 25 毫秒 1 個請求的速率。

您可以通過執行以下操作來創建它:

limiter?:=?rate.NewLimiter(rate.Every(25?*?time.Millisecond),?2)

邊注:

  • 在生成中,上下文ctx不應存儲在結構中,而應按請求存儲??雌饋頃?code>Client被重用,因此您可以將上下文傳遞給RateLimitFunc()或 適當的地方,而不是在客戶端結構上存儲單個上下文。


查看完整回答
反對 回復 2023-06-12
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

func RateLimit(ctx context.Context) {

? ? limiter := rate.NewLimiter(40, 10)

? ? err := limiter.Wait(ctx)

? ? if err != nil {

? ? ? ? // Log the error and return

? ? }

? ? // Do the actual work here

}

查看完整回答
反對 回復 2023-06-12
  • 2 回答
  • 0 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號