python - 在函数中取消计时器的问题(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()
我希望根据触发器的值启动或取消相同的计时器。计时器及其回调应在函数中定义。
解决方案
我从@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()
这似乎在保持代码紧凑的同时解决了问题。
推荐阅读
- python - 更新 UserProfile(OneToOne 模型到 Django User 模型)
- c# - ListViewItem中如何操作多个Socket?
- webstorm - 如何在键入时打开完成
- scala - Scala 等价于 Haskell 的转置
- android - 没有操作栏的Android滑动菜单
- gcc - 套准偏移如何影响印刷
- objective-c - 如何从目标C中的矩形视图中裁剪三角形视图?
- react-virtualized - React-virtualized Multiple Column Sort,加载后排序
- javascript - 无法从 mongodb 访问数据
- javascript - vue.js 无法读取 null 的属性“名称”,但控制台无法提供错误的文件路径