# -*- coding: utf-8 -*- """Демо: ThreadPoolExecutor, Future и порядок завершения. Запуск из корня курса: python lab02_threads/examples/02_executor_future_demo.py Показывает: - pool.map: результаты в порядке входа, даже если завершились в другом; - submit + as_completed: обрабатываем по мере готовности. """ import os import sys import time from concurrent.futures import ThreadPoolExecutor, as_completed sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) from common.tasks import io_fetch def main(): # «Сервер» отвечает тем медленнее, чем больше номер запроса delays = [0.30, 0.25, 0.20, 0.15, 0.10] print("--- pool.map: результаты в порядке входа ---") t0 = time.perf_counter() with ThreadPoolExecutor(max_workers=5) as pool: results = list(pool.map(io_fetch, range(5), delays)) print(f" порядок: {[r[0] for r in results]} (как на входе)") print(f" время: {time.perf_counter() - t0:.3f} c " f"(последовательный был бы {sum(delays):.2f} c)\n") print("--- submit + as_completed: по мере готовности ---") t0 = time.perf_counter() with ThreadPoolExecutor(max_workers=5) as pool: futures = {pool.submit(io_fetch, i, d): i for i, d in enumerate(delays)} for fut in as_completed(futures): item = futures[fut] print(f" завершён запрос {item} " f"(через {time.perf_counter() - t0:.3f} c)") print(f" время: {time.perf_counter() - t0:.3f} c\n") print("--- Future: .result() блокирует до готовности ---") with ThreadPoolExecutor(max_workers=2) as pool: fut = pool.submit(io_fetch, 42, 0.20) print(f" done() сразу после submit: {fut.done()}") result = fut.result() # ждём print(f" done() после result(): {fut.done()}, результат: {result}") if __name__ == "__main__": main()