2017-02-06 11 views
1

話は変わる二つのスレッドとグローバル変数で始まる。..多くの時間:)ナンバーワンは(簡単にするために、我々は、T1呼ぶ)乱数とストアを生成し、スレッドpythonのグローバル変数は、

それはグローバル変数GLBにあります。

スレッド番号2(別名t2)グローバル変数の値をチェックし、値に達すると一定期間まで値を出力し始めます。

しかし、t1でグローバル変数の値が変更された場合でも、ループ内の値が変更され、これは必要ありません!

import random 
import time 
import threading 


GLB = [0,0] 

#this is a thread 
def t1(): 
    while True: 
     GLB[0] = random.randint(0, 100) 
     GLB[1] = 1 
     print GLB 
     time.sleep(5) 


#this is a thread 
def t2(): 
    while True: 
     if GLB[0]<=30: 
      static = GLB 
      for i in range(50): 
       print i," ",static 
       time.sleep(1) 




a = threading.Thread(target=t1) 
a.start() 


b = threading.Thread(target=t2) 
b.start() 

while True: 
    time.sleep(1) 

質問は次のとおりです:

私は擬似コードを書こうとする理由のために、ループ内の変数静的に変更?それはループからエスケープする定数unitlのままにする必要があります! 変数へのロックを作成できますか?あるいは、問題を解決する他の方法がありますか?

ありがとうございました。

+0

'static'はそのループ内で変更すべきではありません。私たちがテストするための小さな実例を書くのはどうですか? – tdelaney

+0

問題は '静的'を割り当てる機会が来る前に 'GLB'が変更されるということです。それはあなたが見ているものですか? – tdelaney

+0

@AlejandroSazo 'static'はオブジェクトへの新しい参照であるため、コピーする必要はありません。その不変の 'int'から、あなたは本当にコピーを得ていません。 – tdelaney

答えて

0

GLBは可変オブジェクトです。あるスレッドが一貫性​​のある値を参照できるようにするには、別のスレッドがスレッドを変更するときに、オブジェクトを一時的にロックで保護します(変更子は待機します)。あなたの例では、コピーが最善の選択肢と思われます。 Pythonでは、スライスコピーはアトミックなので、他のロックは必要ありません。

import random 
import time 
import threading 

GLB = [0,0] 

#this is a thread 
def t1(): 
    while True: 
     GLB[0] = random.randint(0, 100) 
     GLB[1] = 1 
     print GLB 
     time.sleep(5) 

#this is a thread 
def t2(): 
    while True: 
     static = GLB[:] 
     if static[0]<=30: 
      for i in range(50): 
       print i," ",static 
       time.sleep(1) 

a = threading.Thread(target=t1) 
a.start() 

b = threading.Thread(target=t2) 
b.start() 

while True: 
    time.sleep(1) 
+0

私は2つのtime.sleep()をもっと明示的に追加します。 forループ内の変数の静的な変更は、常に「定数」のアスペクトでループ内にあります! – egariM

+0

私は動作テストを書いており、 '静的'は変わらない。テストを書いて投稿し、間違っていることを証明してください! – tdelaney

+0

2つの関数はスレッド内にあり、t1()はt2()のforループの内側にあるときにもグローバル変数の値を継続的に変更します。コードに外部リンクを貼り付けてもいいですか?ペーストビンを使って? – egariM

関連する問題