Context в CPython основан не на обычной изменяемой хеш-таблице dict, а на персистентной структуре HAMT. Она позволяет дёшево копировать контекст и разделять неизменённые узлы между версиями.
Как устроен механизм Context Variables (contextvars) на уровне внутренней хэш-таблицы CPython?
Context в CPython основан не на обычной изменяемой хеш-таблице dict, а на персистентной структуре HAMT. Она позволяет дёшево копировать контекст и разделять неизменённые узлы между версиями.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Context в CPython основан не на обычной изменяемой хеш-таблице dict, а на персистентной структуре HAMT. Она позволяет дёшево копировать контекст и разделять неизменённые узлы между версиями.
Ключами служат объекты ContextVar. При set создаётся изменённый путь структуры, а не копируется всё отображение; copy_context() имеет O(1) сложность. Планировщик asyncio переключает текущий контекст вместе с задачей, поэтому значения не смешиваются как при обычном thread-local в одном потоке. Token позволяет восстановить предыдущее значение. Копия контекста поверхностная: изменяемый объект, лежащий в значении, не клонируется автоматически.
Источник: peps.python.org.