2016-10-20 4 views
0

私は1つの属性と1つのメソッドを持つ非常に単純なクラスを持っています。私はメソッドの属性の値に基づいて実行したいと思います。下のクラスコードさ:Python - 属性変更に基づいたメソッドでwhileループを停止

class TestWhile() 
    def __init__(self): 
     self.status = "OFF" 
    def StreamV(self): 
     while self.Status == "ON" 
     print "nonstop" 

は基本的に私が何をしたいのかステータスがオフに設定されるまでStreamVを実行し、ONにステータスを設定されています。私は上記のテストを実行すると

P = TestWhile() 
T.Status = "ON" 
T.StreamV() 
T.Status = "OFF" 

が、それは決してステータス=「OFF」の行にそれをしないと無限ループを実行します。これは、次のように私が欲しいものです。これをどうすれば解決できますか?

+2

..を参照してください。 ://docs.python.org/3/library/threading.html)ここまで – Aaron

+0

whileループが 'self.Sstatus = 'OFF''にする方法を作らない限り、スレッディングを行う必要があります。 – MooingRawr

+0

スレッドを行うにはどうしたらいいですか? – DeeTee

答えて

3

T.StreamV()への呼び出しは、一般にBusy loopingと呼ばれ、メインスレッドをブロックします。あなたが効果的に記述したのは、シグナルが来るまで(シグナルが届くまで)バックグラウンドスレッドが(T.Statusアトリビュートから)

スレッディングは簡単な問題では比較的近づくことができ、知るには非常に便利なツールです。スーパーワイドの観点から見ると、Pythonのスレッドは、メインスクリプトが何か他のことをしているときに同時に実行できる関数です。この点に関して、Pythonスレッドは実際に実行する関数を渡すことで作成されます。

例:

import threading 
import time 

class TestWhile(object): 
    def __init__(self): 
     self.status = "OFF" 
     self.streamVthread = threading.Thread(target=self.StreamV) #create a thread for our streamV function 
    def StreamV(self): 
     print "starting thread" 
     while self.Status == "ON": 
      print "nonstop" 
      time.sleep(1) 
     print "stopping thread" 

T = TestWhile() #our thread is actually created here, but is hasn't started yet 
print 'T.Status -> "ON"' 
T.Status = "ON" #T.StreamV could be modified to run at creation and wait for this to change to "ON" 
T.streamVthread.start() #this calls the T.StreamV function in a separate thread 
time.sleep(6) 
T.Status = "OFF" 
print 'T.Status -> "OFF"'

私はあなたのプログラムの流れを理解するためにprint文の束を追加しました。質問があればコメントしてください。

編集:

スレッドがメインスレッドと同じ名前空間に存在したスレッドに引数を渡すので、彼らがメインのスクリプトで変数を共有している場合、彼らは両方のそれにアクセスできます。これは、同時に同じものにアクセスする複数のスレッドで問題を引き起こす可能性があります(詳細はlocks and other mutex constructsを参照してください)。しかしように行うことができるスレッドの作成時に引数を渡す:

import threading 
import time 

def sayHello(after_secs, name): 
    time.sleep(after_secs) 
    print("hello from {}".format(name)) 

thread1 = threading.Thread(target=sayHello, args=(3,"thread1")) 
thread2 = threading.Thread(target=sayHello, args=(1,"thread2")) 
thread3 = threading.Thread(target=sayHello, args=(5,"thread3")) 

print "starting thread1" 
thread1.start() 
print "starting thread2" 
thread2.start() 
print "starting thread3" 
thread3.start() 


thread1.join() #wait for thread1 to finish 
print "thread1 is done" 
thread2.join() #wait for thread2 to finish 
print "thread2 is done" 
thread3.join() #wait for thread3 to finish 
print "thread3 is done"

これらのprint文は、彼らが行うために起こる理由を判断できる場合y'allのは、HTTPS([スレッド]必要

+0

は私がする必要があるように見えますが、私はPythonを使って自分のPCに接続するまでテストできません。私が持っていた1つの質問は、もし私がStreamVに議論を渡したいのであれば?スレッドはどのように変わるでしょうか? – DeeTee

+1

最初の例では、スレッドがメインスクリプトと同じ 'T.Status'へのアクセス権を持っていることがわかりますが、これはGlobalを使うのに匹敵します:いくつかの場合には便利ですが、スレッド内の呼び出された関数に明示的な変数を渡すための私の編集を参照してください – Aaron

関連する問題