ZBLOG

golang 限流器实现

Golang限流器是一种用于控制程序访问速度的工具,可以防止程序被过多的请求压垮。下面是一个基本的Golang限流器实现:

package main

import (
    "fmt"
    "time"
)

type Limiter struct {
    rateLimit       time.Duration
    lastRequestTime time.Time
}

func NewLimiter(rateLimit time.Duration) *Limiter {
    return &Limiter{
        rateLimit:       rateLimit,
        lastRequestTime: time.Unix(0, 0),
    }
}

func (l *Limiter) Wait() {
    timeSinceLastRequest := time.Since(l.lastRequestTime)
    timeToWait := l.rateLimit - timeSinceLastRequest
    if timeToWait > 0 {
        time.Sleep(timeToWait)
    }
    l.lastRequestTime = time.Now()
}

func main() {
    // 创建限流器,每秒只允许一个请求
    limiter := NewLimiter(time.Second)
    for i := 0; i < 10; i++ {
        // 等待一段时间以保持请求速率不超过限制
        limiter.Wait()
        fmt.Println("发送请求:", i+1)
    }
}

在上面的例子中,我们首先定义了一个 Limiter 结构体来存储限流的相关信息。在 NewLimiter() 函数中,我们初始化了一个新的限流器,并将最后一个请求时间设置为 Unix 时间戳 0(即 January 1, 1970, 00:00:00 UTC)。

接下来,我们定义了 Wait() 函数,它会计算自上次请求以来所经过的时间,并将其与规定的速率进行比较。如果时间间隔小于限流器的速率,那么程序就会等待一段时间。如果时间间隔大于或等于限流器的速率,程序就会记录当前时间并继续执行。

最后,在主函数中,我们创建了一个新的限流器,并通过 for 循环来模拟多次请求。每次请求都需要在 limiter.Wait() 中等待一段时间以保证请求速率不超过限制。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=603

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?