首页 > 解决方案 > 在函数中取消计时器的问题(python)

问题描述

我有一个函数不断在循环中运行,检查它是否应该启动或取消在函数范围内定义的计时器。定时器需要在函数中定义,因为回调也在函数中定义。我可以很好地启动计时器,但是当它尝试取消时,我收到错误“分配前引用的局部变量'计时器'”。

我尝试在全局范围内定义计时器及其回调(这是不可取的),但我收到另一个错误“线程只能启动一次”。

import threading
import random

def start():
    trigger = random.randint(0,1)
    def do_something():
        print(trigger)
    if trigger == 0:
        timer = threading.Timer(2,do_something)
        timer.start()
    else:
        timer.cancel() #: if trigger is 1, I want to cancel the timer
    threading.Timer(1,start).start() #: start() is in a loop and is constantly checking trigger's value

start()

我希望根据触发器的值启动或取消相同的计时器。计时器及其回调应在函数中定义。

标签: python

解决方案


我从@quamrana 和@smci 学习并想出了这个

import threading
import random

class Timer():
    pass
t = Timer()

def start():
    trigger = random.randint(0,1)
    def do_something():
        print(trigger)
    if trigger == 0:
        t.timer = threading.Timer(1,do_something)
        t.timer.start()
    else:
        if hasattr(t,'timer'):
            t.timer.cancel() 
    threading.Timer(1,start).start() 

start()

这似乎在保持代码紧凑的同时解决了问题。


推荐阅读