Проверяет понимание изменений в Python 3.13, связанных с глобальной блокировкой интерпретатора (GIL), и их влияние на многопоточность.
GIL (Global Interpreter Lock) — это блокировка в CPython, которая позволяет выполнять только один поток за раз. Это упрощает управление памятью, но ограничивает производительность многопоточных программ, особенно на многоядерных процессорах. В Python 3.13 появилась экспериментальная возможность отключить GIL.
В Python 3.13 добавлена опция сборки --disable-gil, которая создаёт версию интерпретатора без GIL. В таком режиме потоки могут выполняться параллельно на разных ядрах. Однако это требует осторожности: без GIL разработчики должны сами синхронизировать доступ к общим данным, используя, например, threading.Lock или queue.Queue.
import threading
import time
counter = 0
lock = threading.Lock()
def increment():
global counter
for _ in range(1000000):
with lock:
counter += 1
threads = [threading.Thread(target=increment) for _ in range(4)]
for t in threads:
t.start()
for t in threads:
t.join()
print(counter) # Ожидается 4000000Этот код безопасен даже без GIL, так как использует блокировку. Без неё могла бы возникнуть гонка данных.
Опциональное отключение GIL в Python 3.13 даёт разработчикам гибкость: для CPU-интенсивных задач можно использовать free-threaded сборку, а для I/O-bound или legacy-кода — стандартную. Это шаг к улучшению производительности, но требует внимания к синхронизации.