Виктор Стиннер, один из ключевых разработчиков CPython, разобрал в блоге, как устроен P... — 25 июня 2026 г. в 10:03:52.747
Виктор Стиннер, один из ключевых разработчиков CPython, разобрал в блоге, как устроен PyMutex, замок размером в один байт, на котором держится free-threaded Python. Зачем такой маленький? В режиме без GIL блокировка нужна на каждый объект отдельно: свой замок у каждого dict, list, set. Старый замок через py\_recursivelock\_t занимает 72 байта. Для сравнения, пустой список в Python 3.13 весит 56 байт, пустой словарь 64. Вешать по 72 байта на каждый объект невозможно. PyMutex решает это: один байт, из которого реально используются два бита под состояния (свободен, занят, занят с ожидающими потоками). Что показали замеры. Дизайн взят из WebKit, у их движка есть WTF::Lock, а под капотом лежит \_PyParkingLot, кроссплатформенный аналог futex. На захвате и освобождении без конкуренции: 🔘Linux x86-64: PyMutex 11 нс против 44 нс у старого замка, в 4 раза быстрее; 🔘macOS arm64: 13 нс против 18 нс, в 1,4 раза; 🔘Windows x86-64: 13 нс против 38 нс, в 2,9 раза. Оговорка для авторов C-расширений: напрямую PyMutex использовать не стоит, легко словить взаимоблокировку. Для защиты доступа к объектам есть critical section API, Py\_BEGIN\_CRITICAL\_SECTION\(obj\). @zen_of_python

