在Python中正确执行计时器功能的方法

时间:2010-05-25 16:28:36

标签: python multithreading timer

我有一个GUI应用程序需要在后台执行一些简单的操作(更新wx python进度条,但这并不重要)。我看到有一个threading.timer类..但似乎没有办法让它重复。因此,如果我使用计时器,我最终必须在每次执行时都创建一个新线程......比如:

import threading
import time

def DoTheDew():
    print "I did it"
    t = threading.Timer(1, function=DoTheDew)
    t.daemon = True
    t.start()    

if __name__ == '__main__':
    t = threading.Timer(1, function=DoTheDew)
    t.daemon = True
    t.start()
    time.sleep(10)

这似乎是我制作了一堆线程,做了一件愚蠢的事情并且死了..为什么不把它写成:

import threading
import time

def DoTheDew():
    while True:
        print "I did it"
        time.sleep(1)


if __name__ == '__main__':
    t = threading.Thread(target=DoTheDew)
    t.daemon = True
    t.start()
    time.sleep(10)

我是否错过了让定时器继续做某事的方法?这些选项中的任何一个看起来都很傻......我正在寻找一个更像java.util.Timer的计时器,它可以安排线程每秒发生一次...如果在Python中没有办法,我的上述方法中的哪一个更好,为什么?

2 个答案:

答案 0 :(得分:3)

更像这样的模式可能是你应该做的,但很难说,因为你没有提供很多细节。

def do_background_work(self):
    # do work on a background thread, posting updates to the
    # GUI thread with CallAfter
    while True:
        # do stuff
        wx.CallAfter(self.update_progress, percent_complete)

def update_progress(self, percent_complete):
    # update the progress bar from the GUI thread
    self.gauge.SetValue(percent_complete)

def on_start_button(self, event):
    # start doing background work when the user hits a button
    thread = threading.Thread(target=self.do_background_work)
    thread.setDaemon(True)
    thread.start()

答案 1 :(得分:2)

wxwindows有its own timer。它支持一次拍摄和重复发生的事件。