Python ThreadPoolExecutor - Wird der Callback garantiert im selben Thread ausgeführt wie die übergebene Funktion?

8

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.

%Vor%

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.

    
Praveen Gollakota 24.09.2014, 16:03
quelle

1 Antwort

6

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:

schauen %Vor%

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%     
dano 24.09.2014, 16:15
quelle