# -*- coding: utf-8 -*- """Демо: sys.setswitchinterval — интервал переключения GIL. Запуск из корня курса: python lab03_gil/examples/03_switch_interval_demo.py Уменьшение интервала переключения не добавляет параллельности (GIL всё равно один), но увеличивает накладные расходы: слишком частые переключения замедляют работу. """ import os import sys import time from concurrent.futures import ThreadPoolExecutor sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) def burn(n): s = 0.0 for i in range(n): s += i ** 0.5 return s def bench(interval, n_threads, n_total): sys.setswitchinterval(interval) bounds = [i * n_total // n_threads for i in range(n_threads + 1)] chunks = [bounds[i + 1] - bounds[i] for i in range(n_threads)] t0 = time.perf_counter() with ThreadPoolExecutor(max_workers=n_threads) as pool: pool.map(burn, chunks) return time.perf_counter() - t0 def main(): N = 4_000_000 print(f"{'интервал':>10} {'T(1 поток)':>12} {'T(4 потока)':>12}") for interval in (0.005, 0.0005, 0.00005): t1 = bench(interval, 1, N) t4 = bench(interval, 4, N) print(f"{interval * 1000:>9.1f}мс {t1:>11.3f}c {t4:>11.3f}c" f" S(4)={t1 / t4:.2f}") sys.setswitchinterval(0.005) # вернуть значение по умолчанию print("\nВывод: интервал переключения влияет на накладные расходы,") print("но параллельности не добавляет — держатель GIL всё равно один.") if __name__ == "__main__": main()