В каком потоке будут выполняться расчеты? - PullRequest
0 голосов
/ 08 октября 2019

У меня есть следующие классы, например:

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 ]

2 голосов
/ 08 октября 2019

Функции вызываются в любом потоке, в котором запущена вызывающая функция. Тот факт, что они являются объектными методами, не меняет этого.

Поскольку self.objectA.functionA() вызывается из aggregator.aggregator_function(), и этовызывается из метода Worker.run(), вызывается в потоке Worker.

1 голос
/ 08 октября 2019

Все они будут запускаться из рабочего потока.

Вы должны быть в состоянии проверить это с помощью чего-то вроде print(threading.get_ident()).

...