0

我有一个计时器功能,我在另一个这样的功能中调用它

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

即使在输入“退出”命令后,该功能正在打印“你好”我无法弄清楚代码有什么问题

4

2 回答 2

3

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

要强行杀死线程,请查看:

有什么方法可以杀死 Python 中的线程吗?

于 2013-09-01T07:01:53.417 回答
2

你用cancel错了。在http://docs.python.org/2/library/threading.html中,它声明:“与线程一样,通过调用它们的 start() 方法来启动定时器。定时器可以停止(在它的动作开始之前) ) 通过调用 cancel() 方法。计时器在执行其操作之前将等待的时间间隔可能与用户指定的时间间隔不完全相同。

cancel在您的代码中,如果您在定时线程已经开始执行(它将在 5 秒内)之后尝试使用,则cancel什么也做不了。线程将永远留在while循环中,f直到你给它某种强制中断。因此,在运行后的前 5 秒内输入“exit”execute即可。它将在线程开始之前成功停止计时器。但是在您的计时器停止并且您的线程开始执行其中的代码之后f,将无法停止它cancel

于 2013-09-01T06:48:50.443 回答