代码改变世界

go语言从例子开始之Example34.速率限制

2019-10-30 09:24  _天枢  阅读(288)  评论(0编辑  收藏  举报

速率限制(英) 是一个重要的控制服务资源利用和质量的途径。Go 通过 Go 协程、通道和打点器优美的支持了速率限制。

Example:

package main
import "fmt"
import "time"



func main() {

    //首先我们将看一下基本的速率限制。
    //假设我们想限制我们接收请求的处理,我们将这些请求发送给一个相同的通道。
    requests := make(chan int, 5)
    for i:=1; i<=5; i++{
        requests <- i
    }
    close(requests)

    //这个 limiter 通道将每 200ms 接收一个值。
    //这个是速率限制任务中的管理器。
    limter := time.Tick(time.Millisecond * 200)

    //通过<- limter在每次请求前阻塞 limiter 通道的一个接收
    //我们限制自己每 200ms 执行一次请求。
    for j:=1; j<=5; j++{
        <- limter
        fmt.Println("request", j, time.Now())
    }

}

Result:

$ go run example.go
request 1 2019-10-30 09:16:22.3579116 +0800 CST m=+0.209001001
request 2 2019-10-30 09:16:22.5589099 +0800 CST m=+0.409999301
request 3 2019-10-30 09:16:22.7591482 +0800 CST m=+0.610237601
request 4 2019-10-30 09:16:22.9575729 +0800 CST m=+0.808662301
request 5 2019-10-30 09:16:23.15802 +0800 CST m=+1.009109401

运行程序,我们看到第一批请求意料之中的大约每 200ms 处理一次。

 

坐标: 上一个例子   下一个例子