← retour aux snippets

ThreadPoolExecutor: as_completed et timeouts

Soumettre des tâches I/O et récupérer les résultats au fil de l'eau.

python concurrency #threadpool

objectif

Soumettre des tâches I/O et récupérer les résultats au fil de l’eau.

code minimal

from concurrent.futures import ThreadPoolExecutor, as_completed
def work(x): return x*x
with ThreadPoolExecutor(max_workers=4) as ex:
    futures = [ex.submit(work, i) for i in range(5)]
    res = [f.result() for f in as_completed(futures)]
print(sorted(res) == [0,1,4,9,16])  # attendu: True

utilisation

from concurrent.futures import ThreadPoolExecutor, TimeoutError
def slow(): import time; time.sleep(0.01); return 1
with ThreadPoolExecutor(max_workers=2) as ex:
    fut = ex.submit(slow)
    try:
        print(fut.result(timeout=0.1) == 1)
    except TimeoutError:
        print(False)

variante(s) utile(s)

from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=None) as ex:
    out = list(ex.map(lambda x: x+1, [1,2,3]))
print(out == [2,3,4])

notes

  • threads pour I/O liées; ne pas surprovisionner inutilement.
  • Utilisez timeouts et cancel pour éviter des blocages.