Python线程化和移交值

时间:2013-04-19 09:48:29

标签: python

我试图不时地更新连续运行新值的线程。

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"))

这适用于打印正确的arg。

但是,如果需要,我如何使用新值更新单个线程?并非所有线程都需要更新。我班上的setnum方法显然不起作用,因为它会更新所有线程的值。

我是否需要限制线程生命周期并加入并等待它们完成。然后用新值重新创建它们? 或者我应该为每个线程定义一个变量 - 我该如何动态地做到这一点? 或者有更好的方式我没有看到? 谢谢!

编辑:

我想我最终会得到类似的东西:

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

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

然后在每个上使用一个方法来设置值?

1 个答案:

答案 0 :(得分:0)

对于单个整数值,您可以使Test成为线程的子类(并run调用printloop)。然后其他线程可以安全地调用setnum。由于GIL以及您设置单个值的事实,这是安全的,如果您正在执行更复杂的更新,则必须将setnumprintloop中的内部循环包含在锁定中防止竞争条件。

编辑:一个简单的例子

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()