Init
This commit is contained in:
commit
c394677d07
59 files changed
+5149
No files matched your search
@@ -0,0 +1,50 @@
|
||||
# -*- 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()
|
||||
Reference in new issue
Block a user