Возможно ли передать результат одного потока в другой поток?

#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