Можно ли узнать возврат функции при использовании многопоточности Thread на Python?

Ниже приведен простой пример для понимания.
Подобное выполнение потоков подразумевается использовать в бесконечном цикле. Одна из функций имеет возврат значения, можно ли после завершения ее выполнения как-то достать это значение возврата (подразумевается дальнейшее использование этого значения в следующих итерациях)?

from threading import Thread

def sum_(x, y):
    time.sleep(2)
    return x + y

def mul_(x, y):
    time.sleep(2)
    print(x*y)


x = 5
y = 4

t1 = Thread(target=sum_, args=(x,y))
t2 = Thread(target=mul_, args=(x,y))

t1.start()
t2.start()
t1.join()
t2.join()
  • Вопрос задан
  • 418 просмотров
Решения вопроса 1
@Elick Автор вопроса
from threading import Thread

class ThreadWithResult(Thread):
    def __init__(self, group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None):
        def function():
            self.result = target(*args, **kwargs)
        super().__init__(group=group, target=function, name=name, daemon=daemon)

def sum_(x, y):
    time.sleep(2)
    return x + y

def mul_(x, y):
    time.sleep(2)
    print(x*y)

x = 5
y = 4

t1 = ThreadWithResult(target=sum_, args=(x,y))
t2 = Thread(target=mul_, args=(x,y))

t1.start()
t2.start()
t1.join()
t2.join()
print(t1.result)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Лучше используй долгоживущие потоки и пару queue.Queue. Из первой потоки в цикле извлекают задания и обрабатывают их, во вторую складывают ответы. Главный поток - наоборот, кладёт задания в первую очередь и извлекает ответы из второй.

См. также: паттерн "поставщик-потребитель".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы