2013-03-17 146 views
2

在Windows上使用Python 2.7.3。如何在2個線程之間共享變量

如何在線程之間共享變量num,例如num平方後打印?

我意識到,我需要了解如何線程工作,但文檔沒有了,我沒有發現任何東西在這裏無論是..
因此,能不能有人解釋線程是如何工作的,以及如何之間共享變量2個線程?

我的代碼(不斷印刷2

import threading 
def func1(num): 
    while num < 100000000: 
     num = num**2 
def func2(num): 
    while num < 100000000: 
     print num, 
num = 2 
thread1 = threading.Thread(target=func1,args=(num,)) 
thread2 = threading.Thread(target=func2,args=(num,)) 
print 'setup' 
thread1.start() 
thread2.start() 

回答

9

一般這個問題的答案是隊列:

import threading, Queue 

def func1(num, q): 
    while num < 100000000: 
     num = num**2 
     q.put(num) 

def func2(num, q): 
    while num < 100000000: 
     num = q.get() 
     print num, 

num = 2 
q = Queue.Queue() 
thread1 = threading.Thread(target=func1,args=(num,q)) 
thread2 = threading.Thread(target=func2,args=(num,q)) 
print 'setup' 
thread1.start() 
thread2.start() 

打印

=== [email protected]:~/StackOverflow:507 > ./tst.py 
setup 
4 16 256 65536 4294967296 

通知比這(和你) code,num是func1和func2中的局部變量,它們與eac沒有關係除了它們接收到全局變量num的初始值外。所以編號是而不是在這裏分享。相反,一個線程將其num的值放入隊列中,另一個線程將該值綁定到同名的本地(因此不同)變量。但它當然可以使用任何名稱。

+0

所以,隊列是2個線程之間的通信機制。另外,一個隊列可以包含任何數據結構,對嗎? – pradyunsg 2013-03-17 14:40:02

+0

是的,隊列是一種線程安全的通信方式。它可以包含任何數據,列表,字典,甚至是異常(這可以用於發送回主進程)。 – uselpa 2013-03-17 14:48:45

+0

感謝您澄清我的懷疑..只是一個小問題(在我upvote之前)..我可以有任何數量的隊列(受處理能力限制)。我對麼? – pradyunsg 2013-03-17 14:55:20