Wird im ThreadPoolExecutor (TPE) der Rückruf immer garantiert im selben Thread wie die übergebene Funktion ausgeführt?Python ThreadPoolExecutor - wird der Callback garantiert im selben Thread wie die übergebene Funktion ausgeführt?
Zum Beispiel habe ich dies mit dem folgenden Code getestet. Ich lief es viele Male und es schien wie func
und callback
lief immer im selben Thread.
import concurrent.futures
import random
import threading
import time
executor = concurrent.futures.ThreadPoolExecutor(max_workers=3)
def func(x):
time.sleep(random.random())
return threading.current_thread().name
def callback(future):
time.sleep(random.random())
x = future.result()
cur_thread = threading.current_thread().name
if (cur_thread != x):
print(cur_thread, x)
print('main thread: %s' % threading.current_thread())
for i in range(10000):
future = executor.submit(func, i)
future.add_done_callback(callback)
jedoch schien es nicht, wenn ich die time.sleep(random.random())
Aussagen entfernt, das heißt wenigstens einige func
Funktionen und callbacks
tat nicht Lauf im selben Thread.
Für ein Projekt, an dem ich arbeite, muss der Callback immer auf dem gleichen 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 schaute auf die source code for executors und es scheint nicht wie wir den Thread auf den Haupt-Thread wechseln, bevor wir den Rückruf ausführen. Aber ich wollte nur sicher sein.
Und was 'ProcessPoolExecutor'? Callbacks "get_ident" ist auch anders – Winand