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([スレッド]必要
..を参照してください。 ://docs.python.org/3/library/threading.html)ここまで – Aaron
whileループが 'self.Sstatus = 'OFF''にする方法を作らない限り、スレッディングを行う必要があります。 – MooingRawr
スレッドを行うにはどうしたらいいですか? – DeeTee