Asynchrone Aufgaben mit Pool.apply_async()
Neben map()
bietet die multiprocessing.Pool()
-Klasse eine andere Methode zum parallelen Ausführen von Prozessen, nämlich apply_async()
. Mit dieser Methode können Sie einen Funktionsaufruf an einen Prozesspool übermitteln und sofort fortfahren, ohne auf das Ergebnis zu warten. Stattdessen können Sie eine Callback-Funktion verwenden, um das Ergebnis des Funktionsaufrufs abzurufen, wenn es bereit ist.
Bitte vervollständigen Sie slow_square.py
.
import multiprocessing
import time
def slow_square(x):
time.sleep(1)
return x * x
def callback(result):
print(result)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
results = [pool.apply_async(slow_square, (x,), callback=callback) for x in range(10)]
for result in results:
result.wait()
print("All tasks completed.")
In diesem Beispiel definieren wir eine Funktion slow_square()
, die eine Zahl x annimmt, eine Sekunde wartet und dann das Quadrat von x zurückgibt. Wir definieren auch eine Callback-Funktion callback()
, die einfach das Ergebnis ausgibt, wenn es verfügbar ist.
Anschließend erstellen wir einen Prozesspool mit vier Prozessen und verwenden apply_async()
, um für jede Zahl im Bereich von 0 bis 9 einen Funktionsaufruf an den Pool zu übermitteln. Wir übergeben die slow_square()
-Funktion und das Argument x über den args
-Parameter und geben auch die Callback-Funktion an, die aufgerufen werden soll, wenn das Ergebnis bereit ist.
Wir durchlaufen dann die Liste der Ergebnisse und rufen result.wait()
auf, um den Hauptthread zu blockieren, bis das Ergebnis bereit ist. Schließlich geben wir eine Nachricht aus, um anzuzeigen, dass alle Aufgaben abgeschlossen sind.