我在循环中不断运行一个函数,检查它是否应该启动或取消函数范围中定义的计时器。需要在函数中定义计时器,因为该函数还定义了回调。我可以允许启动计时器,但是当它试图取消时,我会在分配之前会发现一个错误的"本地变量"。
。我尝试在全局范围中定义计时器及其回调(这是不希望的(,并且我会收到另一个错误'只有一旦启动了"线程"。
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()
我希望根据触发器的值启动或取消相同的计时器。计时器及其回调应在功能中定义。
此程序显示如何使用随机数来启动或停止计时器。
如果随机数选择了0
足够的时间,则将启动计时器并允许继续定时直到时间耗尽并调用其目标。
如果随机数选择1
,则取消计时器,并且目标未调用:
import threading
import random
import time
class Timing:
def __init__(self):
self.timer = None # No timer at first
self.something = None # Nothing to print at first
self.restart()
def restart(self):
self.run = threading.Timer(1.1, self.start)
self.run.start()
def cancel(self):
if self.run is not None:
self.run.cancel()
self.run = None
def start(self):
trigger = random.randint(0, 1)
self.do_start(trigger)
def do_start(self, trigger):
print('start', trigger)
if trigger == 0:
if self.timer is None:
self.something = trigger
self.timer = threading.Timer(2, self.do_something)
self.timer.start()
else:
if self.timer is not None:
self.timer.cancel()
self.timer = None
self.something=None
self.restart()
def do_something(self):
print(self.something)
t = Timing()
print('sleeping...')
time.sleep(20)
t.cancel()
t.do_start(1)
t.cancel()
print('Done')
样本输出(YMMV,因为其随机(
sleeping...
start 1
start 0
start 1
start 0
start 0
0
start 1
start 0
start 1
start 1
start 1
start 1
start 1
start 0
start 1
start 0
start 0
0
start 1
start 0
start 1
Done
我从@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()
这似乎可以在保持代码紧凑的同时解决问题。