我有一个计时器功能,我在另一个函数中调用它
import time
import threading
def f():
while(True):
print "hello"
time.sleep(5)
def execute():
t = threading.Timer(5,f)
t.start()
command = ''
while command != 'exit':
command = raw_input()
if command == 'exit':
t.cancel()
即使进入“退出”命令后,该功能正在打印“你好” 我无法弄清楚代码是什么错误
答案 0 :(得分:3)
class threading.Timer - cancel() - Doc-Link
停止计时器,取消执行计时器的操作。 只有在计时器仍处于等待阶段时才会有效。
你想要完成的一个非常简单的版本看起来像这样。
import threading
_f_got_killed = threading.Event()
def f():
while(True):
print "hello"
_f_got_killed.wait(5)
if _f_got_killed.is_set():
break
def execute():
t = threading.Timer(5,f)
t.start()
command = ''
while command != 'exit':
command = raw_input()
if command == 'exit':
_f_got_killed.set()
t.cancel()
execute()
强行杀死一个线程看看:
答案 1 :(得分:2)
您使用cancel
错误。在http://docs.python.org/2/library/threading.html中,它指出:“通过调用start()方法启动定时器,就像使用线程一样。通过调用cancel()方法可以停止定时器(在其动作开始之前)。计时器将在执行其操作之前等待,可能与用户指定的时间间隔不完全相同。“
在您的代码中,如果您在定时线程已经开始执行后尝试使用cancel
(它将在5秒内完成),cancel
什么都不会完成。该线程将永远保留在while
f
循环中,直到您给它某种强制中断。因此,在运行execute
后的前5秒内键入“exit”即可。它会在线程开始之前成功停止计时器。但是在你的计时器停止并且你的线程开始执行f
中的代码之后,将无法通过cancel
停止它。