python线程奇怪的行为

时间:2013-09-01 06:21:24

标签: python python-2.7 python-multithreading

我有一个计时器功能,我在另一个函数中调用它

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

即使进入“退出”命令后,该功能正在打印“你好” 我无法弄清楚代码是什么错误

2 个答案:

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

强行杀死一个线程看看:

Is there any way to kill a Thread in Python?

答案 1 :(得分:2)

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

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