API速率限制是指限制特定时间段内允许请求API的数量或频率的过程。这对于保护服务器免受大量请求的攻击非常重要,因此必须及时实现该功能。下面是一种基于令牌桶算法的Python代码实现速率限制的示例:
import time
class RateLimiter:
def __init__(self, rate, per):
self._rate = rate
self._per = per
self._allowance = rate
self._last_check = time.time()
def update(self):
current = time.time()
time_passed = current - self._last_check
self._last_check = current
self._allowance += time_passed * (self._rate / self._per)
if self._allowance > self._rate:
self._allowance = self._rate
def consume(self, tokens=1):
self.update()
if self._allowance >= tokens:
self._allowance -= tokens
return True
return False
# Test
limiter = RateLimiter(1, 1)
for i in range(10):
if limiter.consume():
print("Allowed")
else:
print("Blocked")
time.sleep(0.1)
在此实现中,RateLimiter类包括三个成员变量:速率(rate)、时间窗口宽度(per)和令牌数(allowance)。构造函数初始化速率和时间窗口,并在令牌桶中填充全部令牌。update方法计算自上次调用以来允许请求的令牌数,consume方法从令牌桶中消耗指定数量的令牌。
在consuming代码中,我们模拟了一个调用API的循环。每次循环迭代,我们使用consume方法检查是否可以将请求发送到服务器。如果allowance足够,调用成功,然后将allow