2016-11-30 101 views
2

以下程序仅打印一次hello world,而不是每5秒打印一次字符串。定时器只在python中运行一次

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) 

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

+0

你为什么要在一个额外的类中包装它以开始?这是必要的吗? – nlsdfnbch

回答

1

(程序-2)每5秒打印一次字符串,因为它正在递归地调用它自己。正如你所看到的,你可以在自己内部调用foo()函数,这是因为它起作用的原因。

如果你想打印每5秒一个字符串 - 使用一个类你可以(方案1)(但它不是一个真正的好习惯!):

from threading import Timer 

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

timer = TestTimer() 
timer.boo() 
0

正如已经指出的那样,你“再调用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()