mirror of
				https://github.com/avatao-content/baseimage-tutorial-framework
				synced 2025-10-31 20:02:55 +00:00 
			
		
		
		
	Refactor AsyncRateLimiter for ease of use (IOLoop passing)
This commit is contained in:
		| @@ -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 | ||||
|         ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user