0

時々新しい値で継続的に実行されるスレッドを更新しようとしています。

class Test:
    def __init__(self, num):
        #testing reasons
        self.num = num

    def printloop(self, num):
        self.num = num
        #running is set to True sometime in the beginning   
        while running:
            print(self.num)
            time.sleep(3)
        if not running:
            print("finished")
    def setnum(self, num):
        self.num = num

次のようなスレッドを作成します。

t1 = threading.Thread(target=test.printloop,args=("1"))

これは機能し、適切な引数を出力します。

しかし、必要に応じて、単一のスレッドを新しい値で更新するにはどうすればよいでしょうか? すべてのスレッドを更新する必要があるわけではありません。私のクラスの setnum メソッドは、すべてのスレッドの値を更新するため、明らかに機能していません。

スレッドの有効期間を制限して参加し、それらが終了するのを待つ必要がありますか? そして、それらを新しい価値観で再創造する?または、スレッドごとに変数を定義する必要があります-動的に行うにはどうすればよいですか? または、私が見ないより良い方法はありますか?ありがとう!

編集:

私は次のようなものになると思います:

test1 = Test(1)
..
test5 = Test(5)

t1 = threading.Thread(target=test1.printloop,args=("1"))
t5 = threading.Thread(target=test5.printloop,args=("5"))

次に、それぞれにメソッドを使用して値を設定しますか?

4

1 に答える 1

0

単一の整数値の場合Test、thread のサブクラスを作成できます (そしてruncallを持つことができますprintloop)。その後、他のスレッドはsetnum安全に呼び出すことができます。GIL と単一の値を設定しているという事実により、これは安全です。より複雑な更新を行う場合は、ラップsetnumして内側のループをprintloopロックして競合状態を防ぐ必要があります。

編集:簡単な例

from threading import Thread
from time import sleep

class Output(Thread):

    def __init__(self, num):
        super(Output, self).__init__()
        self.num = num
        self.running = False

    def run(self):
        self.running = True
        while self.running:
            print self.num
            sleep(1)

    def stop(self):
        self.running = False

    def set_num(self, num):
        self.num = num

output = Output(0)
output.start()
sleep(3)
output.set_num(1)
sleep(3)
output.stop()
output.join()
于 2013-04-19T10:27:42.863 に答える