web-dev-qa-db-ja.com

2つのスレッド間で変数を共有する方法

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

この質問に対する一般的な答えはキューです。

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の値をキューに入れ、もう一方のスレッドはこの値を同じ名前のローカル(したがって異なる)変数にバインドします。ただし、もちろん、任意の名前を使用できます。

25
uselpa