2015-04-20 169 views
0

我发现了一个解决方案,每N秒周期执行一个函数。定期在线程中执行一个函数

import threading; 

def do_every (interval, worker_func, iterations = 0): 
    if iterations != 1: 
    threading.Timer (
     interval, 
     do_every, [interval, worker_func, 0 if iterations == 0 else iterations-1] 
    ).start(); 

    worker_func(); 

def print_hw(): 
    print "hello world"; 

def print_so(): 
    print "stackoverflow" 


# call print_so every second, 5 times total 
do_every (1, print_so, 5); 

# call print_hw two times per second, forever 
do_every (0.5, print_hw); 

当我们此刻的执行执行该代码就开始打印的“Hello World”和“计算器”(在时间= 0秒)。什么是可能的方式,使其打印时间= 1秒和时间= 0.5秒(不是开始时间= 0秒)不使用时间。睡眠

回答

1

我会真的犹豫,每隔一次产生一个新的TimerTimer延伸Thread,并且没有人希望每隔几秒就开始一个新线程。

如果我们看一下Python的源代码,我们可以为Timer类提供我们自己的实现。我不知道Python,因此可能有一种扩展类的方法,而不是基本上复制它的所有代码。

Timer类使用Event(也在threading模块中)等待指定的时间量。

import threading; 
from threading import Thread; 
from threading import Event; 

#Extended from a class written by Itamar Shtull-Trauring 
class MultiTimer(Thread): 
    def __init__(self, interval, function, count = 0, args=None, kwargs=None): 
     Thread.__init__(self) 
     self.interval = interval 
     self.function = function 
     self.args = args if args is not None else [] 
     self.kwargs = kwargs if kwargs is not None else {} 
     self.finished = Event() 
     self.count = count 
     self.infinite = count == 0 

    def cancel(self): 
     """Stop the timer if it hasn't finished yet.""" 
     self.finished.set() 

    def run(self): 
     while not self.finished.is_set(): 
      self.finished.wait(self.interval) 
      if not self.finished.is_set(): 
       self.function(*self.args, **self.kwargs) 
       self.decrementCount() 

    def decrementCount(self): 
     if not self.infinite: 
      self.count -= 1 
      if self.count == 0: 
       self.finished.set() 

def hello(): 
    print "hello, world" 

#prints "hello, world" 3 times, at time = 2, 4, 6 
t = MultiTimer(2.0, hello, 3) 
t.start(); 

#never stops printing "hello, world" every 2 seconds 
u = MultiTimer(2.0, hello) 
u.start(); 
+0

“持续时间”是一个比“count”更好的变量名称,用于记录。我将暂缓编辑答案,因为我确定有一个比'MultiTimer'更好的名字。 –

相关问题