все Python 3threadingпонятие
GIL
концепции
Global Interpreter Lock — мьютекс CPython, позволяющий только одному потоку выполнять байт-код одновременно. Блокирует параллелизм CPU-задач, но не мешает I/O-операциям.
Синтаксис
# GIL — концепция, не синтаксис
GIL не делает твой код потокобезопасным: составные операции (проверил-потом-изменил, counter += 1) всё равно гонятся между потоками, так что Lock по-прежнему обязателен. С Python 3.13 есть free-threaded сборка (PEP 703), где GIL можно отключить: в 3.13 экспериментальная, с 3.14 официально поддерживаемая (PEP 779), но необязательная, но в обычной сборке он на месте.
Примеры
# GIL мешает CPU-задачам: два потока не быстрее одного
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import multiprocessing
def cpu_task(n):
return sum(range(n))
if __name__ == '__main__': # обязательно: процессы-помощники заново импортируют модуль
with ThreadPoolExecutor() as ex: # потоки: байт-код исполняет один поток за раз
print(sum(ex.map(cpu_task, [10**6] * 4))) # → 1999998000000
with ProcessPoolExecutor(mp_context=multiprocessing.get_context('spawn')) as ex: # процессы: у каждого свой интерпретатор и свой GIL
print(sum(ex.map(cpu_task, [10**6] * 4))) # → 1999998000000
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности