2011-04-28 311 views
9

グローバル変数を使用して別のスレッドでループを実行して終了します。このコードはループ内のスレッドを停止していないようです。私はプログラムがもう印刷されないと期待しています。 2秒後にはまだ無期限に実行されます。Pythonでスレッド間でグローバル変数を共有する方法は?

私はここで何か根本的に間違っていますか?

import time 
import threading 
run = True 

def foo(): 
    while run: 
     print '.', 

t1 = threading.Thread(target=foo) 
t1.run() 
time.sleep(2) 
run = False 
print 'run=False' 
while True: 
    pass 

答えて

4
  1. あなたはt1.run()を呼び出すことにより、メインスレッド上でfoo()を実行しています。代わりにt1.start()に電話する必要があります。

  2. foo()という2つの定義がありますが、問題はありませんが、そこには存在しないはずです。

  3. あなたはsleep()をスレッドループ(foo()内)に入れませんでした。これはプロセッサを貪欲にするので、これは非常に悪いことです。もしそれが少し長く眠らないようにするには、少なくともtime.sleep(0)(他のスレッドにリリースタイムスライス)を置くべきです。

はここで働い例です:

import time 
import threading 
run = True 

def foo(): 
    while run: 
     print '.', 
     time.sleep(0) 

t1 = threading.Thread(target=foo) 
t1.start() 
time.sleep(2) 
run = False 
print 'run=False' 
while True: 
    pass 
+1

私は彼らがスレッドがノンストップ処理を行っているケースを表現しようとしていると思うので、ポイント3は間違いです。または、あなたは 'time.sleep(0) 'がなくても、グローバルインタープリタロックのために他のスレッドが実行されないようにしていると言っていますか? –

+0

答えに感謝しています。私は間違いを犯しました。 – user730094

+0

@Mike:私はそれについては確信していませんが、それは私の心を越えました。つまり、私はPythonの新しい実装がGILの欠点を修正したことを知っています。Pythonの私のバージョンはこのコードを完全にうまく実行し、他のスレッドの実行を妨げてはいけません。 –

4

あなたはrun()を呼び出すことにより、スレッドを開始していない、あなたはstart()を呼び出すことによって、それを起動します。 それは私のために働いた固定。

0

答えに加えて...

変数 'run'はグローバル変数です。

他の機能(たとえば、 main()関数内で変数がグローバルであることを参照する必要があります。そうでなければ、グローバルに変更されません。

def main(): 
    global run 
    ... 
    run = False 
    ... 

if __name__ == "__main__": 
main() 
関連する問題