【问题标题】:Resettable Timer object implementation python可复位定时器对象实现python
【发布时间】:2019-05-16 11:21:20
【问题描述】:

我需要一个可以重置的 Python 计时器 (timer.reset())。 我已经有一个定期计时器。 有没有这种定时器的库?

class MyTimer(threading.Timer):
    def __init__(self, t):
        threading.Thread.__init__(self)
        self.__event = threading.Event()
        self.__stop_event = threading.Event()
        self.__intervall = t

    def run(self):
        while not self.__stop_event.wait(self.__intervall):
            self.__event.set()

    def clear(self):
        self.__event.clear()

    def is_present(self):
        return self.__event.is_set()

    def cancel(self):
        self.__stop_event.set()

【问题讨论】:

    标签: python timer reset


    【解决方案1】:

    这是一个实现reset 方法以将计时器“延长”原始间隔的示例。它使用内部 Timer 对象而不是子类化 threading.Timer

    from threading import Timer
    import time
    
    
    class ResettableTimer(object):
        def __init__(self, interval, function):
            self.interval = interval
            self.function = function
            self.timer = Timer(self.interval, self.function)
    
        def run(self):
            self.timer.start()
    
        def reset(self):
            self.timer.cancel()
            self.timer = Timer(self.interval, self.function)
            self.timer.start()
    
    
    if __name__ == '__main__':
        t = time.time()
        tim = ResettableTimer(5, lambda: print("Time's Up! Took ", time.time() - t, "seconds"))
        time.sleep(3)
        tim.reset()
    

    输出:

    Time's Up! Took 8.011203289031982 seconds

    【讨论】:

      【解决方案2】:

      这是一个简单的例子。你应该考虑加锁。

      import threading
      import time
      
      def hi( ):
          print('hi')
          mine.start()
      
      
      
      class ReusableTime():
          def __init__(self, t, func):
              self._t = t
              self._func = func
      
          def start(self):
              self._thread = threading.Timer(self._t, self.handler)
              self._thread.start()
      
          def handler(self):
              self._func()
      
      
      mine = ReusableTime(2, hi)
      mine.start()
      time.sleep(100)
      

      【讨论】:

        猜你喜欢
        • 2017-05-05
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 2011-04-30
        • 2018-10-27
        • 1970-01-01
        相关资源
        最近更新 更多