Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python定时器不工作_Python_Multithreading_Timer - Fatal编程技术网

Python定时器不工作

Python定时器不工作,python,multithreading,timer,Python,Multithreading,Timer,我有以下代码: def countdown(): def countdown1(): print 'countdown1' def countdown2(): def countdown3(): takePic() self.pic.set_markup("<s

我有以下代码:

        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()
def倒计时():
def倒计时1():
打印“倒计时1”
def倒计时2():
def倒计时3():
takePic()
self.pic.set_标记(“1”);
打印1
t3=计时器(1.0,倒计时3)
t3.start()
self.pic.set_标记(“2”);
打印2
t2=计时器(1.0,倒计时2)
t2.start()
self.pic.set_标记(“3”);
打印3
t1=计时器(1.0,倒计时1)
t1.start()
倒计时

它应该显示从3开始的倒计时。数字3出现了,但之后什么也没有发生。帮助?

您的主线程可能在任何计时器触发之前退出。解决这个问题的最简单和最粗糙的方法是让主线程在必要的时候休眠。一个更明智的选择是在倒计时3结束时发出类似信号量的信号,并在主线程中等待它

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

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)
def倒计时():
self.pic.set_标记(“3”);
打印3
收益率1.0
打印“倒计时1”
self.pic.set_标记(“2”);
打印2
收益率1.0
self.pic.set_标记(“1”);
打印1
收益率1.0
takePic()
对于倒计时()中的t:
时间。睡眠(t)

您的主线程可能在任何计时器触发之前退出。解决这个问题的最简单和最粗糙的方法是让主线程在必要的时候休眠。一个更明智的选择是在倒计时3结束时发出类似信号量的信号,并在主线程中等待它

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

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)
def倒计时():
self.pic.set_标记(“3”);
打印3
收益率1.0
打印“倒计时1”
self.pic.set_标记(“2”);
打印2
收益率1.0
self.pic.set_标记(“1”);
打印1
收益率1.0
takePic()
对于倒计时()中的t:
时间。睡眠(t)

您确定其他命令没有阻塞吗?像
设置标记
?一个简单的例子对我很有用:

>>> 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()

你确定其他命令没有阻塞吗?像
设置标记
?一个简单的例子对我很有用:

>>> 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()

为什么不在
.join()
之后加入计时器线程呢
.start()
这样剩下的代码就可以等到计时器完成后再继续呢?

为什么不在
.join()
之后加入计时器线程呢,因此,代码的其余部分将等待计时器完成后才能继续?

需要多长时间?我该如何使用信号量呢?谢谢你的快速回复!对不起,我不用勺子喂食。开始阅读,尝试使用它们,然后在遇到困难时回来问问题。需要多长时间?我该如何使用信号量呢?谢谢你的快速回复!对不起,我不用勺子喂食。开始阅读,尝试使用它们,然后在遇到问题时回来问问题。将尝试用指纹替换,只是为了看看。不。不管怎样,我怀疑这是set_标记,但摆脱它并不能解决问题。我会尝试用打印替换它,只是为了看看。不。不管怎么说,我怀疑它是set_标记,但摆脱它并不能解决问题。这是最简单的解决方案,由于懒惰,我将其标记为正确。感谢所有其他人的解决方案!这是最简单的解决方案,由于懒惰,我将其标记为正确。感谢所有其他人的解决方案!