Выполнить только последний python вызов функции в течение определенного периода времени? - PullRequest
0 голосов
/ 01 мая 2020

Допустим, у меня есть функция, которая обновляет некоторые внутренние состояния приложения:

def on_change(*args, **kwargs):
    pass  # some compute intensive state change

Эта функция может запускаться до сотни раз в секунду (из-за множества событий колесика мыши, запускающих обновление) - я бы нравится выполнять вышеупомянутую функцию только один раз, и должен выполняться только последний вызов.

Каков наилучший шаблон проектирования для управления такой ситуацией? Единственный способ, о котором я могу думать, - это создавать отдельный поток для каждого вызова on_change и делить переменную между ними, но это звучит слишком грязно ...

Спасибо!

1 Ответ

1 голос
/ 03 мая 2020
class Waiter:
    def __init__(self):
        self.args = ()
        self.kwargs = {}
        self.changed = False

    def on_change(self, *args, **kwargs):
        # This is the event handler
        # It does nothing but save the latest arguments
        self.args = args
        self.kwargs = kwargs
        self.changed = True

    def tick(self):
        # Call this function once per second, or whatever
        if self.changed:
            # Do your updates, using self.args and self.kwargs
            self.changed = False

Поскольку вы упомянули события мыши, вы, очевидно, пишете приложение GUI. Все двигатели GUI, по моему опыту, имеют таймеры и возможность вызывать функции периодически c. Используйте эту возможность для периодического вызова тика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...