【问题标题】:How to share a variable between 2 threads如何在2个线程之间共享一个变量
【发布时间】:2013-03-17 13:43:31
【问题描述】:

在 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()

【问题讨论】:

    标签: python multithreading variables thread-safety


    【解决方案1】:

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

    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()
    

    打印

    === pu@pumbair:~/StackOverflow:507 > ./tst.py
    setup
    4 16 256 65536 4294967296
    

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

    【讨论】:

    • 那么,队列是两个线程之间的通信机制。另外,队列可以包含任何数据结构,对吧??
    • 是的,队列是一种线程安全的通信方式。它可以包含任何数据、列表、字典,甚至是异常(这对于发送回主进程很有用)。
    • 当然可以,但通常您只需要几个。例如,在具有 1 个生产者和 100 个工作线程的配置中,您只需要 1 个队列来放置生产者的工作负载。所有工作线程(做同样的事情)都可以从那个唯一的队列中获取数据。
    • 我认为最好指出python是按值调用的,所以你传递“num”你传递数字2,你不传递某种指针第二。如果您使用全局变量,您会看到您感兴趣的效果 - 然后您不会向函数传递任何内容。
    • 这似乎是一个push and pop的风格,所以一旦你调用了.get(),这个值就不再存在了。它可以很好地用于获取一个线程的值,但如果您有 2 个或更多线程尝试获取(),则效果不佳,因为后面的线程只会崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2021-01-27
    相关资源
    最近更新 更多