44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
# -*- 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() |