Refactor AsyncRateLimiter for ease of use (IOLoop passing)

This commit is contained in:
Kristóf Tóth 2018-07-30 18:04:24 +02:00
parent eeb36b6488
commit ee7adb10be

View File

@ -4,6 +4,8 @@
from functools import wraps, partial
from time import time, sleep
from tfw.decorators.lazy_property import lazy_property
class RateLimiter:
def __init__(self, rate_per_second, action=sleep):
@ -34,19 +36,25 @@ class RateLimiter:
class AsyncRateLimiter(RateLimiter):
def __init__(self, rate_per_second, ioloop):
self.ioloop = ioloop
self.last_callback = None
def __init__(self, rate_per_second, ioloop_factory):
self._ioloop_factory = ioloop_factory
self._ioloop = None
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)
@lazy_property
def ioloop(self):
return self._ioloop_factory()
self.last_callback = self.ioloop.call_later(
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
)