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

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

WBOY
Freigeben: 2023-04-13 10:43:09
nach vorne
2293 Leute haben es durchsucht

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)
Nach dem Login kopieren

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))
Nach dem Login kopieren

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。
Nach dem Login kopieren

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())
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:51cto.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage