您的位置:

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,通过堵塞通道的方式,把进程堵住。