【问题标题】:Timer runs only once in python定时器在python中只运行一次
【发布时间】:2017-04-14 23:32:57
【问题描述】:

下面的程序只打印一次 hello world 而不是每 5 秒打印一次字符串。

from threading import Timer;

class TestTimer:

    def __init__(self):
        self.t1 = Timer(5.0, self.foo);

    def startTimer(self):
        self.t1.start();

    def foo(self):
        print("Hello, World!!!");

timer = TestTimer();
timer.startTimer();


                       (program - 1)

但下面的程序每 5 秒打印一次字符串。

def foo():
    print("World");
    Timer(5.0, foo).start();

foo();

                        (program - 2)

为什么 (program - 1) 不是每 5 秒打印一次字符串?以及如何使(程序-1)连续每5秒打印一次字符串。

【问题讨论】:

  • 你为什么要把它包装在一个额外的类中?有必要吗?

标签: python-3.x


【解决方案1】:

(program - 2) 每 5 秒打印一次字符串,因为它正在递归调用自身。如您所见,您在其内部调用foo() 函数,这就是原因,因为它可以工作。

如果你想在 (program - 1) 中每 5 秒打印一个字符串,你可以使用一个类(但这不是一个好习惯!):

from threading import Timer

class TestTimer:
    def boo(self):
        print("World")
        Timer(1.0, self.boo).start()

timer = TestTimer()
timer.boo()

【讨论】:

    【解决方案2】:

    正如已经指出的那样,您正在递归调用foo()

    def foo():
        print("World");
        Timer(5.0, foo).start();  # Calls foo() again after 5s and so on
    
    foo();
    

    在您的问题中,您已经围绕 threading.Timer 创建了一个包装器 - 我建议您简单地将其子类化:

    from threading import Timer
    
    class TestTimer(Timer):
    
        def __init__(self, i):
            self.running = False
            super(TestTimer, self).__init__(i, self.boo)
    
        def boo(self):
            print("Hello World")
    
        def stop():
            self.running = False
            super(TestTimer, self).stop()
    
        def start():
            self.running = True
            while self.running:
                super(TestTimer, self).start()
    
    t = TestTimer(5)
    t.start()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      相关资源
      最近更新 更多