Wenn es um Threads geht, sollte Ihr Gehirn diesen Eindruck haben: Wir können steuern, wann er beginnt, aber wir können nicht steuern, wann er endet. Wie erhalten wir also den Rückgabewert des Threads? Heute werde ich einige meiner eigenen Praktiken vorstellen.
ret_values = [] def thread_func(*args): ... value = ... ret_values.append(value)
Ein Grund für die Auswahl einer Liste ist: Die append()-Methode der Liste ist threadsicher und in CPython verhindert die GIL den gleichzeitigen Zugriff auf ihnen. Wenn Sie eine benutzerdefinierte Datenstruktur verwenden, müssen Sie eine Thread-Sperre hinzufügen, mit der die Daten gleichzeitig geändert werden.
Wenn Sie im Voraus wissen, wie viele Threads vorhanden sind, können Sie eine Liste fester Länge definieren und dann den Rückgabewert gemäß dem Index speichern, z. B.:
from threading import Thread threads = [None] * 10 results = [None] * 10 def foo(bar, result, index): result[index] = f"foo-{index}" for i in range(len(threads)): threads[i] = Thread(target=foo, args=('world!', results, i)) threads[i].start() for i in range(len(threads)): threads[i].join() print (" ".join(results))
Standard Die Methode thread.join() wartet nur auf das Ende der Thread-Funktion und hat keinen Rückgabewert. Wir können das laufende Ergebnis der Funktion hier zurückgeben:
from threading import Thread def foo(arg): return arg class ThreadWithReturnValue(Thread): def run(self): if self._target is not None: self._return = self._target(*self._args, **self._kwargs) def join(self): super().join() return self._return twrv = ThreadWithReturnValue(target=foo, args=("hello world",)) twrv.start() print(twrv.join()) # 此处会打印 hello world。
Wenn wir auf diese Weise thread.join() aufrufen, um auf das Ende des Threads zu warten, erhalten wir auch den Rückgabewert des Threads.
Ich denke, die Standardbibliothek concurrent.futures von Python bietet erweiterte Thread-Operationen und kann den Rückgabewert des Threads direkt abrufen Ganz elegant. Code wie folgt:
import concurrent.futures def foo(bar): return bar with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: to_do = [] for i in range(10):# 模拟多个任务 future = executor.submit(foo, f"hello world! {i}") to_do.append(future) for future in concurrent.futures.as_completed(to_do):# 并发执行 print(future.result())
Die Ergebnisse einer bestimmten Operation sind wie folgt:
hello world! 8 hello world! 3 hello world! 5 hello world! 2 hello world! 9 hello world! 7 hello world! 4 hello world! 0 hello world! 1 hello world! 6
Das obige ist der detaillierte Inhalt vonDrei Möglichkeiten, den Thread-Rückgabewert in Python zu erhalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!