如何在2个线程之间共享变量

pra*_*nsg 9 python variables multithreading thread-safety

在Windows上使用Python 2.7.3.

如何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()
Run Code Online (Sandbox Code Playgroud)

use*_*lpa 23

这个问题的一般答案是队列:

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()
Run Code Online (Sandbox Code Playgroud)

印花

=== pu@pumbair:~/StackOverflow:507 > ./tst.py
setup
4 16 256 65536 4294967296
Run Code Online (Sandbox Code Playgroud)

注意,在这个(和你的)代码中,num是func1和func2中的局部变量,除了它们接收全局变量num的初始值之外,它们彼此没有关系.所以这里共享num .相反,一个线程将其num的值放入队列,另一个线程将此值绑定到同名的本地(因此不同)变量.但当然它可以使用任何名称.

  • 当然,但通常你只需要一些.例如,在具有1个生产者和100个工作线程的配置中,您只需要1个生成器放置其工作负载的单个队列.所有工作线程(执行相同操作)都可以从该队列中获取数据. (2认同)
  • 我认为最好指出python是按值调用的,所以你传递“num”你传递数字2,你不会传递某种指向数字2的指针。如果您使用全局变量,您会看到您感兴趣的效果 - 那么您就不会向函数传递任何内容。 (2认同)
  • 这看起来就像推送和弹出风格,所以一旦你调用 .get(),该值将不再存在。它对于让一个线程获取值来说效果很好,但如果有 2 个或更多线程尝试 get() 则效果不太好,因为后面一个线程会崩溃。 (2认同)