#python #python-3.x #multithreading #python-multithreading
#python #python-3.x #многопоточность #python-многопоточность
Вопрос:
Я хочу использовать результат (возвращаемое значение) одного потока в другом потоке.
Пример:
def foo():
return "foo"
def bar():
return "bar"
thread_foo = threading.Thread(target = foo)
thread_bar = threading.Thread(target = bar)
thread_foo.start()
thread_bar.start()
Что я хочу сделать, так это использовать выходные данные функции foo
и использовать их в функции bar
.
Я прочитал документы, но, к сожалению, не нашел ничего полезного.
Комментарии:
1. Вы могли бы использовать очередь для передачи данных между потоками docs.python.org/3/library/queue.html если вы используете многопроцессорную обработку, вы могли бы вместо этого использовать канал docs.python.org/3/library /…
2. Я исправил опечатку в теме и исправил две синтаксические ошибки в вашем коде. Пожалуйста, по крайней мере, попробуйте запустить свою программу, прежде чем обращаться за помощью. Поток использует общую память, поэтому любая переменная, доступная обоим потокам, может использоваться для обмена данными. Вы используете очередь для управления параллельным доступом.
3. если вам нужен результат из одного потока в другом потоке — поэтому один поток должен ждать другого потока — тогда потоки могут не иметь смысла, и будет проще
bar(foo())
. В конечном итоге запустите первую функцию нормальноresult = foo()
и позжеThread(target=bar, args=(result,)
. ИЛИ создать функциюdef other(): bar(foo())
, и это выполняется вThread(target=other)
Ответ №1:
Вот простой пример использования одного потока, но вы могли бы легко добавить больше:
import Queue
from threading import Thread
def foo(bar):
print 'hello {0}'.format(bar)
return 'foo'
foo_q= Queue.Queue()
t = Thread(target=lambda q, arg1: q.put(foo(arg1)), args=(foo_q, 'world!'))
t.start()
t.join()
result = foo_q.get()
print result
Ответ №2:
Одним из способов является использование входной очереди для передачи аргументов и выходной очереди для получения результатов. В следующем примере thread — squarer
это поток, который вычисляет свой входной аргумент и «возвращает» результат. bar
является ли другой поток, который использует squarer
, но может так же легко быть основным потоком:
from threading import Thread
from queue import Queue
in_q = Queue()
out_q = Queue()
def squarer():
while True:
x = in_q.get()
if x is None: # signal to terminate
return
out_q.put(x**2) # put answer
def bar():
for x in (range(10)):
in_q.put(x)
result = out_q.get()
print(f'{x}**2 = {result}')
t1 = Thread(target=squarer)
t1.start()
t2 = Thread(target=bar)
t2.start()
t2.join()
in_q.put(None) # signal thread to terminate
t1.join()
С принтами:
0**2 = 0
1**2 = 1
2**2 = 4
3**2 = 9
4**2 = 16
5**2 = 25
6**2 = 36
7**2 = 49
8**2 = 64
9**2 = 81