# -*- coding: utf-8 -*- """Демо: потоки выполняются конкурентно — sleep не складывается. Запуск из корня курса: python lab02_threads/examples/01_threads_sleep_demo.py Пять потоков спят по 0.4 c. Сумма времён = 2 c, реальное время ≈ 0.4 c: пока один поток спит, процессор обслуживает другие. """ import threading import time N_THREADS = 5 SLEEP = 0.4 def worker(idx: int) -> None: name = threading.current_thread().name t0 = time.perf_counter() time.sleep(SLEEP) # «ожидание сети/диска» dt = time.perf_counter() - t0 print(f" {name}: {dt:.3f} c") def main(): print(f"Запускаем {N_THREADS} потоков, каждый спит {SLEEP} c") threads = [threading.Thread(target=worker, args=(i,), name=f"поток-{i}") for i in range(N_THREADS)] t0 = time.perf_counter() for t in threads: t.start() # ВСЕ стартуют первыми... for t in threads: t.join() # ...потом ВСЕ ждём (start и join не перемешивать!) total = time.perf_counter() - t0 print(f"Суммарно: {total:.3f} c " f"(сумма времён была бы {N_THREADS * SLEEP:.1f} c)") print(f"Ускорение: x{N_THREADS * SLEEP / total:.1f} — так работает I/O-параллелизм") if __name__ == "__main__": main()