При работе с многопоточностью в Python часто возникает задача получения возвращаемого значения из потока. Однако, стандартный подход к этому вопросу, используя метод thread.join()
, не дает ожидаемого результата. Вместо возвращаемого значения функции, этот метод возвращает значение None
.
Рассмотрим пример кода на Python, где создается поток, выполняющий функцию, и пытается получить ее возвращаемое значение:
from threading import Thread def foo(bar): print('hello {}'.format(bar)) return 'foo' thread = Thread(target=foo, args=('world!',)) thread.start() return_value = thread.join()
В данном случае переменная return_value
будет равна None
, а не ‘foo’, как можно было бы ожидать.
Однако, есть несколько способов обойти данное ограничение. Один из них — использовать модуль concurrent.futures
стандартной библиотеки Python для создания потока и получения возвращаемого значения.
from concurrent.futures import ThreadPoolExecutor def foo(bar): print('hello {}'.format(bar)) return 'foo' with ThreadPoolExecutor() as executor: future = executor.submit(foo, 'world!') return_value = future.result()
В этом примере executor.submit()
запускает функцию foo
в отдельном потоке и возвращает объект Future
, который представляет собой возможное будущее значение. Метод future.result()
используется для получения возвращаемого значения функции, когда оно становится доступным.
Такой подход позволяет избавиться от проблемы получения возвращаемого значения из потока в Python.
Добавить комментарий