将在哪个线程中执行计算?

时间:2019-10-07 21:58:54

标签: python python-3.x multithreading python-multithreading

例如,我有以下课程:

class CalculatorA:
    def functionA(self):
        #some calculations

class CalculatorB:
    def functionB(self):
        #some calculations

class CalculatorC:
    def functionC(self):
        #some calculations

class Aggregator:
    def __init__(self, objectA, objectB, objectC):
        self.objectA = objectA
        self.objectB = objectB
        self.objectC = objectC

    def aggregator_function(self):
        self.objectA.functionA()
        self.objectB.functionB()
        self.objectC.functionC()

class Worker(threading.Thread):
    def __init__(self,
                 objectA,
                 objectB,
                 objectC):
        threading.Thread.__init__(self)
        self.objectA = objectA
        self.objectB = objectB
        self.objectC = objectC

    def run(self):
        agregator = Aggregator(self.objectA, 
                                self.objectB, 
                                self.objectC)
        agregator.aggregator_function()

我的main()函数:

def main():
    objectA = CalculatorA()
    objectB = CalculatorB()
    objectC = CalculatorC()

worker = Worker(objectA, objectB, objectC)
worker.start()

我在CalculatorA, CalculatorB, CalculatorC函数中创建main()类的对象,并将变量作为参数传递 Worker的构造函数。 Worker类的对象将其保存。稍后,它将变量传递给Aggregator函数中run()对象的构造函数。它在单独的计算线程中创建Aggregator对象。 Aggregator调用函数functionA(), functionB(), functionC()

我的问题是,将在哪个线程中进行函数functionA(), functionB(), functionC()的计算?他们会被执行吗 在工作线程中还是在主线程中?如果在主线程中,应该使用threading.local存储空间吗?

2 个答案:

答案 0 :(得分:2)

在调用函数运行的任何线程中调用函数。它们是对象方法,这一点不会改变。

由于从self.objectA.functionA()调用了aggregator.aggregator_function(),并且从Worker.run()方法中调用了它,所以它在Worker线程中被调用。

答案 1 :(得分:1)

它们都将从工作​​线程中运行。

您应该可以使用print(threading.get_ident())之类的方式进行验证。