Дебютировать без темы - PullRequest
       69

Дебютировать без темы

0 голосов
/ 31 января 2020

У меня была проблема дозирования вызова функции в главном l oop. Я написал некоторый рабочий код, основанный на оценке времени, а затем спросил друга, что, возможно, мне нужно что-то похожее на потоки, чтобы улучшить мой код. Мой друг сказал мне, что есть методы, называемые «debounce and throttle», которые лучше, чем потоки, потому что с потоками легко связываться. Поэтому я провел некоторое исследование, прочитал что-то и пришел к выводу, что для дебадинга нужен поток или что-то параллельное или асинхронное, чтобы работать должным образом, поэтому предложение моего друга было не очень осторожным.

Проблема заключается в том, что только на основе по прошествии времени возможно, что последние вызовы, которые еще не прошли указанный интервал времени, будут потеряны, поскольку функция не будет запущена позже во второй раз с момента ее запуска. Однако в моем конкретном случае c основной l oop следует через равные промежутки времени (в одну секунду), и поэтому единственный риск, который я запускаю, - это потерять последнюю секунду возможного выполнения, что является несуществующей проблемой. .

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

def throttled_debounce(tic, wait):
    def decorate(delayedfun):
        _start = 0
        _value = None
        _lst_e = None
        def wrap(*args, **kwargs):
            nonlocal _start, _value, _lst_e
            val = (args, kwargs)
            if val != _lst_e:
                _start = 0
                _lst_e = val
            elif _lst_e != _value:
                _start += tic
                if _start >= wait:
                   _value = val
                   _start = 0
                   result = delayedfun(*args, **kwargs)
                   return result
        return wrap
    return decorate


tic, wait = 0.5,2

@trothled_debounce(tic,wait)
def printa(s):
    print(s)

from time import sleep

for i in range(1,21): 
    printa(i)
    sleep(tick)
    if i%4 == 0:
        for y in range(3):
            printa(i)

Но, возвращаясь к первоначальному вопросу, я ошибаюсь или в «нормальных» случаях (где основной l oop повторяется непрерывно, без интервалов) лучший способ написать отладку - это с помощью потока или чего-то подобного?

...