Implement IOLoop based AsyncRateLimiter

This commit is contained in:
Kristóf Tóth 2018-07-30 17:55:52 +02:00
parent 6044f70804
commit eeb36b6488

View File

@ -31,3 +31,22 @@ class RateLimiter:
if seconds_to_next_call > 0: if seconds_to_next_call > 0:
return seconds_to_next_call return seconds_to_next_call
return 0 return 0
class AsyncRateLimiter(RateLimiter):
def __init__(self, rate_per_second, ioloop):
self.ioloop = ioloop
self.last_callback = None
super().__init__(
rate_per_second=rate_per_second,
action=self.async_action
)
def async_action(self, seconds_to_next_call):
if self.last_callback:
self.ioloop.remove_timeout(self.last_callback)
self.last_callback = self.ioloop.call_later(
seconds_to_next_call,
self.fun
)