为什么这个线程没有终止?

时间:2014-07-06 09:20:02

标签: python multithreading

我正在尝试使用python线程模块。因为我是系统管理员,我在开发时会有点挣扎;这个概念对我来说有点新鲜。当主线程将标志设置为False

时,我启动了两个线程并且我想要阻止它们
class My_Thread( threading.Thread):
    def __init__(self, thread_id, thread_name, count):
        threading.Thread.__init__(self)
        self.thread_id      = thread_id
        self.thread_name    = thread_name
        self.count          = count

    def run(self):
        do_job(self.thread_name, self.thread_id, self.count)

def do_job(t_name, t_id, count):
    while not get_kill():
        print "It is "+str(time.time())+" and I am "+str(t_name)
        print get_kill()
        time.sleep(count)

kill = False

def get_kill():
    return kill

def set_kill(state):
    kill = state

if __name__ == '__main__':
    a = My_Thread(1, "Thread-1", 2)
    b = My_Thread(2, "Thread-2", 1)
    a.start()
    b.start()

    while(True):
        try:
            pass
        except KeyboardInterrupt,ki:
            set_kill(True)
            sys.exit(0)

但是这两个线程中的值永远不会被读取,并且它们不会退出。为什么没有从线程中正确读取该值?

1 个答案:

答案 0 :(得分:3)

问题

set_kill()中,您要创建一个新的本地变量kill,将其设置为state,然后从该函数返回。实际上,您并未在全局范围内更新kill的值。

要做到这一点,你需要:

def set_kill(state):
    global kill
    kill = state

更好的方法

使用像这样的全局变量通常被认为是不好的做法,您可能希望将kill变量和函数转换为对象,将这些数据和行为封装在一起:

class Kill(object):
    kill = False
    def get(self):
        return self.kill
    def set(self, value):
        self.kill = value

您可以这样使用:

class MyThread(Thread):
    def __init__(self, thread_id, thread_name, count, kill):
        self.kill = kill
        ...

    def do_job(self, ...):
        while not self.kill.get():
            ...

if __name__ == '__main__':
    kill = Kill()
    a = My_Thread(1, "Thread-1", 2, kill)
    b = My_Thread(2, "Thread-2", 1, kill)
    ...
    kill.set(True)