Heim  >  Artikel  >  Backend-Entwicklung  >  Drei Möglichkeiten, den Thread-Rückgabewert in Python zu erhalten

Drei Möglichkeiten, den Thread-Rückgabewert in Python zu erhalten

WBOY
WBOYnach vorne
2023-04-13 10:43:092109Durchsuche

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.

Methode 1: Verwenden Sie eine Liste globaler Variablen, um den Rückgabewert zu speichern

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

Methode 2: Schreiben Sie die Join-Methode von Thread neu und geben Sie sie zurück Der Rückgabewert der Thread-Funktion

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.

Methode 3: Verwenden Sie die Standardbibliothek concurrent.futures

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Magische Methoden in PythonNächster Artikel:Magische Methoden in Python