我试图不时地更新连续运行新值的线程。
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"))
然后在每个上使用一个方法来设置值?
答案 0 :(得分: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()