Найти тему

Обеспечена потокобезопасность в globals() и builtin в Python

📖 В Python локальные и глобальные переменные хранятся в виде словаря. Вы можете получить доступ к этому словарю с помощью встроенных функций locals() и globals():

-2

🔡 Когда мы объявляем переменную, Python проверяет его в словаре глобального пространства имен, если его нет, то добавляет. В CPython проверка происходит в LOAD_GLOBAL - это операция байт-кода в CPython, которая загружает глобальную переменную в стек, с помощью функции _PyDict_LoadGlobal():

Обратите внимание на строку 14
Обратите внимание на строку 14

➕ Так же функция осуществляет поиск в builtins, если значение не найдено в глобальном словаре, поэтому мы в третьей строке видим LOAD_GLOBAL для print в нашем примере.

🚫
_PyDict_LoadGlobal, в свободнопоточной сборке (--disable-gil), использовал непотокобезопасный _Py_dict_lookup и не блокировал словарь. В этом коммите переключились на использование потокобезопасной версии и модифицировали функцию для возврата новой ссылки

✔️ Также для
_Py_dict_lookup добавлен assert о том, что словарь должен быть заблокирован, и исправлен упорядоченный dict для использования потокобезопасной версии.

👉 Подробнее в телеграм канале https://t.me/cpython_ru

#PEP703