52 lines
2.2 KiB
Python
52 lines
2.2 KiB
Python
# -*- 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() |