2011-04-28 117 views
9

我想使用全局变量结束在单独线程中运行的循环。但是这段代码似乎并没有阻止循环中的线程。我希望程序不要再打印'。' 2秒后,但它仍然无限期地运行。如何在Python中跨线程共享全局变量?

我在这里做了一些根本性的错误吗?

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 

回答

4
  1. 您是通过调用t1.run()主线程上执行foo()。您应该拨打t1.start()

  2. 你有两个定义foo() - 没关系,但不应该在那里。

  3. 你没有把sleep()放入线程循环(在foo())中。这是非常糟糕的,因为它支持处理器。你应该至少把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 
+1

我认为他们试图表示线程正在进行不间断处理的情况,所以第3点是没有意义的。或者你是否说缺乏'time.sleep(0)'防止由于全局解释器锁定导致其他线程运行? – 2011-04-28 22:07:13

+0

非常感谢您的答案..我得到了我的错误:) – user730094 2011-04-28 22:16:08

+0

@Mike:我不太确定,但是,它横跨了我的脑海。话虽如此,我知道较新的Python实现已经修复了GIL的一些缺点,而我的Python版本完美地运行了这些代码,并且它不应该阻止其他线程运行。 – 2011-04-28 22:20:38

4

你不通过调用run()启动一个线程,通过调用start()启动它。 修复,使它为我工作。

0

除了给出的答案...

变量'run'是一个全局变量。

当您在其他功能中修改它时,例如在main()函数中,您必须引用该变量为全局变量,否则它将不会被全局修改。

def main(): 
    global run 
    ... 
    run = False 
    ... 

if __name__ == "__main__": 
main()