Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save sergey-miryanov/633666a24e6b745d9b7defe3d8a02969 to your computer and use it in GitHub Desktop.
Save sergey-miryanov/633666a24e6b745d9b7defe3d8a02969 to your computer and use it in GitHub Desktop.
immortals
## Бессмертные объекты и субинтерпретаторы
Интересный факт - если посмотреть код реализации субинтерпретаторов, то никаких отсылок к бессмертным объектам найти не удастся. При этом они являются неотъемлемой основой субинтерпретаторов в CPython.
Как это происходит?
Как уже упоминалось выше, к бессмертным объектам относятся:
1. *статически* выделенные константы - `None`, `False`, `True`, `...`, `NotImplementedType`, `0`, `1`, `''`, `b''`, `()`. (`object.c:_Py_GetConstant_Init`)
2. целые числа в диапазоне [-5, 256] (`pycore_runtime_structs.h:_Py_static_objects`)
3. символы в кодировке latin1
4. статические типы (`_Py_TPFLAGS_STATIC_BUILTIN`), а также их компоненты, такие как, базовый класс, список базовых классов, `MRO` (method-resolution order)
5. интернированные строки и идентификаторы (`pycore_runtime_structs.h:_Py_cached_objects`)
Эти объекты хранятся либо в состоянии рантайма, либо в состоянии главного интерпретатора, и при создании нового субинтерпретатора, просто копируются ссылки, без копирования самих объектов и какой-либо синхронизации (кроме глобальной блокировки `HEAD_LOCK`). Такой подход основывается на том, что все эти объекты бессмертны и какого-то дополнительного управления времени их жизни выполнять не имеет смысл, т.к. главный интерпретатор, который ими *владеет*, будет уничтожен последним.
Помимо этого неявный факт иммортализации объектов используется при передачи данных между интерпретаторами. Сериализация передаваемых данных может быть настроена довольно гибко (можно даже сказать, что это реализация полиморфизма вручную) через структуру `_PyXIData_t` (`pycore_crossinterp.h`). И для таких объектов как None, True, False, кортеж, строка и целые числа, десериализация данных будет выполняться без создания новых объектов, если десериализуемые объекты являются статическими константами.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment