In ThreadPoolExecutor (TPE), la richiamata è sempre garantita per essere eseguita nello stesso thread della funzione inoltrata?Python ThreadPoolExecutor: la richiamata è garantita per essere eseguita nello stesso thread della funzione inviata?
Ad esempio, ho provato questo con il seguente codice. L'ho eseguito più volte e mi è sembrato come func
e callback
eseguito sempre nella stessa discussione.
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)
Tuttavia, sembrava fallire quando ho rimosso i time.sleep(random.random())
dichiarazioni, cioè almeno alcune func
funzioni e callbacks
no fuga stesso thread.
Per un progetto su cui sto lavorando, il callback deve sempre essere eseguito sullo stesso thread della funzione inoltrata, quindi volevo essere sicuro che ciò sia garantito da TPE. (E anche i risultati del test senza il sonno casuale sembravano sconcertanti).
Ho guardato il source code for executors e non sembra che passiamo il thread al thread principale prima di eseguire il callback. Ma volevo solo essere sicuro.
E che dire 'ProcessPoolExecutor'? Anche il 'get_ident' di callback è diverso – Winand