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线程的子类(并run调用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 回答