[英]trying to understand threads
我有疑问,所以请帮助我。
假设我有一个像这样的 class :
class class_1():
def __init__(self):
self.a = 0
self.b = False
def run(self):
while True:
self.worker()
if self.a > 10:
self.b = True
def worker(self):
self.a = self.a + 1
time.sleep(1)
def get_a(self):
return self.a
def get_b(self):
return self.b
我想在一个线程中启动 class 的实例(并且在某些时候有几个实例),并将值从实例拉到主线程或分离线程。
像这样的东西:
def run_instance_1():
global one = class_1
one.run()
def pull_1():
global one
w = one.get_a()
z = one.get_b()
print ('one.a = ' + str(w))
print ('one.b = ' + str(z))
if __name__ == '__main__':
t1 = threading.Thread(name='process 1', target=run_instance_1)
t2 = threading.Thread(name='process 2', target=pull_1)
t1.start()
t2.start()
我的问题是:如果我像上面一样在全局变量中实例化 class ,它真的会在单独的线程中运行吗? 基本概念是从“另一个”线程获取数据。 在全局变量中实例化 class 的想法是可以从任何线程访问。 我是在做某事还是完全不做?
您可以在线程之间共享相同的 object,但我宁愿将实例传递给两个线程,而不是使用全局变量:
def run_instance_1(one):
one.run()
def pull_1(one):
w = one.get_a()
z = one.get_b()
print ('one.a = ' + str(w))
print ('one.b = ' + str(z))
if __name__ == '__main__':
one = class_1()
t1 = threading.Thread(name='process 1', target=run_instance_1, args=(one,))
# alternatively: t1 = threading.Thread(target=one.run)
t2 = threading.Thread(name='process 2', target=pull_1, args=(one,))
t1.start()
t2.start()
这样,您可以确保在两个线程启动之前创建实例并使函数可重用。 另一个潜在问题是 class 属性在线程中被修改,并且这些更改不是原子的。 在这种特殊情况下,您不太可能得到这种情况,但请考虑使用锁来共享对可变数据的访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.