如何在Python中在线程间共享全局变量?
我想用一个全局变量来结束一个在单独线程中运行的循环。但是这段代码似乎没有停止循环中的线程。我希望程序在2秒后不再打印'.',但它还是一直在运行。
我是不是在这里做错了什么根本性的事情?
import time
import threading
run = True
def foo():
while run:
print '.',
t1 = threading.Thread(target=foo)
t1.run()
time.sleep(2)
run = False
print 'run=False'
while True:
pass
3 个回答
1
除了之前给出的回答...
变量 'run' 是一个全局变量。
当你在另一个函数里修改它,比如在 main() 函数里,你必须说明这个变量是全局的,否则它不会被全局修改。
def main():
global run
...
run = False
...
if __name__ == "__main__":
main()
4
你不是通过调用 run()
来启动一个线程,而是要通过调用 start()
来启动它。这样做就能让它正常工作了。
5
你在主线程上执行
foo()
,是通过调用t1.run()
来实现的。其实你应该用t1.start()
来启动线程。你定义了两个
foo()
函数,这没什么大不了的,但最好不要这样。你在线程循环(也就是
foo()
里面)没有放sleep()
。这样做很糟糕,因为会占用处理器资源。你至少应该放一个time.sleep(0)
(这样可以把时间片让给其他线程),如果能让它睡得更久一点就更好了。
下面是一个可以正常工作的例子:
import time
import threading
run = True
def foo():
while run:
print '.',
time.sleep(0)
t1 = threading.Thread(target=foo)
t1.start()
time.sleep(2)
run = False
print 'run=False'
while True:
pass