2013-03-17 148 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