web-dev-qa-db-ja.com

pythonでスレッドを使用して無限ループを実行する

私のプログラムは次のように設計されています。

  1. プログラムの最初の部分は、センサーからリアルタイム値を取得し、それをMatplotlib。を使用してプロットします。これは長時間実行する必要があります。また、情報をデータベースに記録します。
  2. 2番目の部分はIPカメラです。 IPカメラから入力を取得して表示する必要があります。表示するには、OpenCVのimshowメソッドを使用しています。また、IPカメラからのビデオを保存しています。

質問:アルゴリズムが用意されていますが、問題はwhileループでこれら両方を実行する必要があることです。条件は、それらのいずれからも終了できないことです。スレッドはこれに代わる優れた選択肢ですが、GILについて読んだことがあるので、2つの無限ループをどのように実行しますか?

from multiprocessing import Process

def methodA():
    while TRUE:
        do something

def methodB():
    while TRUE:
        do something

p=Process(target=methodA())
p.start()
p1=Process(target=methodB())
p1.start()

プロセスpを開始すると実行が開始されます。その後、p1を開始して同時に実行するにはどうすればよいですか?

私があなたの質問を理解している限り、あなたには彼らに継続的に実行させたい2つの異なるタスクがあります。あなたの質問に関して:

2つの無限ループを実行するにはどうすればよいですか?

これらの無限ループを実行する2つの異なるスレッドを作成できます。最初のスレッドがtask1を実行し、2番目のスレッドがtask2を実行します。

また、スレッドの実行を開始したら、最初のスレッドが連続的/無限に実行されているときに他のスレッドを実行するにはどうすればよいですか?

2つの異なるスレッドを使用している場合、この問題を心配する必要はありません。スレッドがリソースを共有していない場合、この事実を心配する必要はありません。あるスレッドを他のスレッドから停止/一時停止したり、その逆にしたりする場合、フラグまたはロックを使用してメカニズムを実装できます。この場合、次の質問が役立ちます。

Pythonでスレッドを強制終了する方法はありますか?

なぜpython threading.Threadオブジェクトには 'start'がありますが、 'stop'はありませんか?

作成プログラムmunltithreaded

スレッドを使用したサンプル例:

from threading import Thread

class myClassA(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
        self.start()
    def run(self):
        while True:
            print 'A'

class myClassB(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
        self.start()
    def run(self):
        while True:
            print 'B'


myClassA()
myClassB()
while True:
    pass

共有リソースの場合?

それらには Locks を使用します。下記は用例です。 Onetwo および pythonでスレッドを同期する方法

クラスを使用して実行したくない場合はどうすればよいですか?メソッドのみを使用してこれを行うにはどうすればよいですか?

from threading import Thread

def runA():
    while True:
        print 'A\n'

def runB():
    while True:
        print 'B\n'

if __name__ == "__main__":
    t1 = Thread(target = runA)
    t2 = Thread(target = runB)
    t1.setDaemon(True)
    t2.setDaemon(True)
    t1.start()
    t2.start()
    while True:
        pass
32
ρss
    from threading import Thread
import time

class PrintA(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.running = True

    def run(self):
        while self.running:
            print('A')
            time.sleep(1)
    def stop(self):
        self.running = False

class PrintB(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.running = True
    def run(self):
        while self.running:
            print('B')
            time.sleep(2)
    def stop(self):
        self.running = False

a = PrintA()
b = PrintB()

a.start()
b.start()

time.sleep(10)
a.stop()
time.sleep(10)
b.stop()