647 Stimmen

Wie erhält man den Rückgabewert eines Threads in Python?

Die Funktion foo unten gibt eine Zeichenkette zurück 'foo' . Wie kann ich den Wert erhalten 'foo' die vom Ziel des Threads zurückgegeben wird?

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()

Die oben gezeigte "offensichtliche Lösung" funktioniert nicht: thread.join() zurückgegeben None .

0voto

T. Jiang Punkte 45

Eine übliche Lösung besteht darin, die Funktion zu verpacken foo mit einem Dekorator wie

result = queue.Queue()

def task_wrapper(*args):
    result.put(target(*args))

Dann kann der gesamte Code so aussehen

result = queue.Queue()

def task_wrapper(*args):
    result.put(target(*args))

threads = [threading.Thread(target=task_wrapper, args=args) for args in args_list]

for t in threads:
    t.start()
    while(True):
        if(len(threading.enumerate()) < max_num):
            break
for t in threads:
    t.join()
return result

Hinweis

Ein wichtiges Problem ist, dass die Rückgabewerte möglicherweise unbestellt . (In der Tat, die return value wird nicht unbedingt in der queue da Sie beliebig wählen können thread-safe Datenstruktur )

0voto

Smart Manoj Punkte 4319

Kindall's Antwort in Python3

class ThreadWithReturnValue(Thread):
    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs={}, *, daemon=None):
        Thread.__init__(self, group, target, name, args, kwargs, daemon)
        self._return = None 

    def run(self):
        try:
            if self._target:
                self._return = self._target(*self._args, **self._kwargs)
        finally:
            del self._target, self._args, self._kwargs 

    def join(self,timeout=None):
        Thread.join(self,timeout)
        return self._return

-2voto

Kishalay Punkte 1

Ich weiß, dieser Thread ist alt.... aber ich stand vor dem gleichen Problem... Wenn Sie bereit sind, zu verwenden thread.join()

import threading

class test:

    def __init__(self):
        self.msg=""

    def hello(self,bar):
        print('hello {}'.format(bar))
        self.msg="foo"

    def main(self):
        thread = threading.Thread(target=self.hello, args=('world!',))
        thread.start()
        thread.join()
        print(self.msg)

g=test()
g.main()

-2voto

JohnSmith2000 Punkte 1

Der beste Weg... Definieren Sie eine globale Variable und ändern Sie die Variable dann in der Threaded-Funktion. Es muss nichts übergeben oder zurückgegeben werden.

from threading import Thread

# global var
radom_global_var = 5

def function():
    global random_global_var
    random_global_var += 1

domath = Thread(target=function)
domath.start()
domath.join()
print(random_global_var)

# result: 6

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X