2011-04-28 76 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()