Kodduu Python: post #1536 — TG.ME

🔥 concurrent.futures: Простой параллелизм без головной боли


import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from typing import List

def cpu_heavy_task(n: int) -> int:
"""Имитация тяжёлой CPU-задачи (например, вычисление суммы квадратов)."""
return sum(i * i for i in range(n))

def run_sequential(numbers: List[int]) -> List[int]:
"""Последовательное выполнение — медленно."""
return [cpu_heavy_task(n) for n in numbers]

def run_parallel(numbers: List[int], max_workers: int = 4) -> List[int]:
"""Параллельное выполнение с ThreadPoolExecutor."""
results = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
# Отправляем все задачи сразу
future_to_n = {executor.submit(cpu_heavy_task, n): n for n in numbers}

# Получаем результаты по мере готовности
for future in as_completed(future_to_n):
try:
results.append(future.result())
except Exception as e:
print(f"Ошибка в задаче: {e}")
return results

if __name__ == "__main__":
try:
numbers = [500_000, 600_000, 700_000, 800_000] # 4 тяжёлые задачи

print("⏱️ Последовательно:")
start = time.time()
seq_result = run_sequential(numbers)
print(f"Время: {time.time() - start:.2f} сек | Результаты: {seq_result[:2]}...\n")

print(" Параллельно (4 потока):")
start = time.time()
par_result = run_parallel(numbers)
print(f"Время: {time.time() - start:.2f} сек | Результаты: {par_result[:2]}...")

print("\n В параллельном режиме почти в 4 раза быстрее!")
except Exception as e:
print(f"Ошибка: {e}")

📌 concurrent.futures.ThreadPoolExecutor позволяет легко распараллеливать IO-bound и CPU-bound задачи без сложного управления потоками. Используйте as_completed, чтобы получать результаты по мере готовности, и контекстный менеджер — чтобы не забыть закрыть пул.

Подпишись 👉🏻 @KodduuPython 🤖
❤3
July 2, 2026 185 3