27
loading...
This website collects cookies to deliver better user experience
from time import time, sleep
class SlidingWindow:
def __init__(self, capacity, time_unit, forward_callback, drop_callback):
self.capacity = capacity
self.time_unit = time_unit
self.forward_callback = forward_callback
self.drop_callback = drop_callback
self.cur_time = time()
self.pre_count = capacity
self.cur_count = 0
cur_time
is the edge of our current time unit.pre_count
is the previous counter. We pre-fill this to prevent bursting at the beginning of the rate limiter.cur_count
is the current counter that will get filled as new requests come in.handle()
where the magic happens.def handle(self, packet): #1
if (time() - self.cur_time) > self.time_unit: #2
self.cur_time = time()
self.pre_count = self.cur_count
self.cur_count = 0
ec = (self.pre_count * (self.time_unit - (time() - self.cur_time)) / self.time_unit) + self.cur_count #3
if (ec > self.capacity): #4
return self.drop_callback(packet)
self.cur_count += 1 #5
return self.forward_callback(packet)
handle
accepts only 1 parameter: the packet.ec
is bigger than the capacity.from time import time, sleep
class SlidingWindow:
def __init__(self, capacity, time_unit, forward_callback, drop_callback):
self.capacity = capacity
self.time_unit = time_unit
self.forward_callback = forward_callback
self.drop_callback = drop_callback
self.cur_time = time()
self.pre_count = capacity
self.cur_count = 0
def handle(self, packet):
if (time() - self.cur_time) > self.time_unit:
self.cur_time = time()
self.pre_count = self.cur_count
self.cur_count = 0
ec = (self.pre_count * (self.time_unit - (time() - self.cur_time)) / self.time_unit) + self.cur_count
if (ec > self.capacity):
return self.drop_callback(packet)
self.cur_count += 1
return self.forward_callback(packet)
def forward(packet):
print("Packet Forwarded: " + str(packet))
def drop(packet):
print("Packet Dropped: " + str(packet))
throttle = SlidingWindow(5, 1, forward, drop)
packet = 0
while True:
sleep(0.1)
throttle.handle(packet)
packet += 1
Packet Forwarded: 0
Packet Forwarded: 1
Packet Dropped: 2
Packet Forwarded: 3
Packet Dropped: 4
Packet Forwarded: 5
Packet Dropped: 6
Packet Forwarded: 7
Packet Dropped: 8
Packet Forwarded: 9
Packet Dropped: 10
Packet Forwarded: 11
Packet Dropped: 12
Packet Forwarded: 13
Packet Dropped: 14
Packet Forwarded: 15
Packet Dropped: 16
Packet Forwarded: 17
Packet Dropped: 18
Packet Forwarded: 19
Packet Dropped: 20
Packet Forwarded: 21
Packet Dropped: 22
Packet Forwarded: 23