繁体   English   中英

试图理解线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM