我正在尝试使用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)
但是这两个线程中的值永远不会被读取,并且它们不会退出。为什么没有从线程中正确读取该值?
答案 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)