Wird im ThreadPoolExecutor (TPE) der Rückruf immer garantiert im selben Thread wie die übergebene Funktion ausgeführt?
Zum Beispiel habe ich das mit dem folgenden Code getestet. Ich habe es viele Male ausgeführt und es schien, als ob func
und callback
immer im selben Thread liefen.
Es schien jedoch fehlzuschlagen, wenn ich die time.sleep(random.random())
-Anweisungen, d. h. mindestens einige func
-Funktionen und callbacks
nicht im selben Thread löschte.
Bei einem Projekt, an dem ich gerade arbeite, muss der Callback immer im selben Thread wie die übergebene Funktion laufen, also wollte ich sicher sein, dass dies von TPE garantiert wird. (Und auch die Ergebnisse des Tests ohne den zufälligen Schlaf schienen rätselhaft).
Ich habe mir den Quelltext für Executors angeschaut und Es scheint nicht so, als würden wir den Thread auf den Hauptthread umschalten, bevor wir den Callback ausführen. Aber ich wollte nur sicher sein.
Der Rückruf für Future
, der an ThreadPoolExecutor
übergeben wurde, wird im selben Thread ausgeführt, in dem die Aufgabe selbst ausgeführt wird, jedoch nur, wenn der Rückruf vor dem Abschluss der Aufgabe zu Future
hinzugefügt wird. Wenn Sie den Callback hinzufügen, nachdem% code% abgeschlossen ist, wird der Callback in dem Thread ausgeführt, den Sie Future
in aufgerufen haben. Sie können dies sehen, indem Sie auf add_done_callback
source:
Wenn der Status von add_done_callback
anzeigt, dass er abgebrochen oder beendet wurde, wird Future
im aktuellen Ausführungsthread sofort aufgerufen. Andernfalls wird es zu einer internen Liste von Callbacks hinzugefügt, die ausgeführt werden sollen, wenn% code% abgeschlossen ist.
Zum Beispiel:
%Vor%Tags und Links python multithreading callback concurrent.futures