Python定时器无法正常工作

时间:2010-11-03 21:57:40

标签: python multithreading timer

我有以下代码:

        def countdown():
            def countdown1():
                print 'countdown1'
                def countdown2():
                    def countdown3():
                        takePic()
                    self.pic.set_markup("<span size='54000'>1</span>");
                    print 1
                    t3 = Timer(1.0, countdown3)
                    t3.start()
                self.pic.set_markup("<span size='54000'>2</span>");
                print 2
                t2 = Timer(1.0, countdown2)
                t2.start()
            self.pic.set_markup("<span size='54000'>3</span>");
            print 3
            t1 = Timer(1.0, countdown1)
            t1.start()

        countdown()

它应显示从3倒计时。数字3出现,但之后没有任何反应。帮助

3 个答案:

答案 0 :(得分:2)

你的主线程可能会在任何计时器开火之前退出。解决这个问题的最简单和最原始的方法是让主线程在必要时休眠。一个更健全的选择是在countdown3的末尾发出类似信号量的信号,并在主线程中等待它。

一个更优雅的解决方案,可以与更广泛的调度和异步框架集成,是使用生成器来反转控制流程:

def countdown():
    self.pic.set_markup("<span size='54000'>3</span>");
    print 3
    yield 1.0

    print 'countdown1'
    self.pic.set_markup("<span size='54000'>2</span>");
    print 2
    yield 1.0

    self.pic.set_markup("<span size='54000'>1</span>");
    print 1
    yield 1.0

    takePic()

for t in countdown():
    time.sleep(t)

答案 1 :(得分:1)

为什么在.join()之后只有.start()你的计时器线程,以便其余的代码等到计时器完成后再继续?

答案 2 :(得分:0)

您确定其他命令没有阻止吗?像set_markup一样?一个简化的例子对我有用:

>>> from threading import Timer
>>> def lvl1():
    def lvl2():
        print "evaling lvl2"
        def lvl3():
            print "evaling lvl3"
            print "TakePic()"
        print 1
        t3 = Timer(1.0, lvl3)
        t3.start()
    print 2
    t2 = Timer(2.0, lvl2)
    t2.start()

>>> lvl1()
2
>>> evaling lvl2
1
evaling lvl3
TakePic()