Dzień dobry. Mam aplikację, w której on-demand aktualizuje się pewien wewnętrzny stan poprzez API. Problem w tym, że nie mam kontroli nad tym, kiedy jest to aktualizowane - to wybór usera. Może napieprzać w przycisk "aktualizuj" ile chce. I tego chciałbym uniknąć. Napisałem wrapper, który blokuje wywołania funkcji częściej niż podany czas.
import time
from functools import wraps
from datetime import timedelta, datetime
def updater(delta_time):
def updater_impl(function):
@wraps(function)
def updater_impl_impl(*args, **kwargs):
now = datetime.now()
if not hasattr(function, '__updater_last_call_time'):
function.__updater_last_call_time = datetime.min
if now - function.__updater_last_call_time > delta_time:
function(*args, **kwargs)
function.__updater_last_call_time = now
return updater_impl_impl
return updater_impl
@updater(timedelta(seconds=10))
def foo():
print(foo.__qualname__)
if __name__ == '__main__':
foo() # calls foo
foo() # not calls foo
foo() # not calls foo
foo() # not calls foo
time.sleep(10)
foo() # calls foo
foo() # not calls foo
time.sleep(5)
foo() # not calls foo
Co o tym myślicie? Może jest lepszy / gotowy sposób na rozwiązanie takiego problemu?