[subinterpreters] Static types incorrectly share some objects between interpreters · Issue #94673 · python/cpython (original) (raw)
While static types (PyTypeObject
values) don't themselves ever change (once PyType_Ready()
has run), they do hold mutable data. This means they cannot be safely shared between multiple interpreters without a common GIL (and without state leaking between).
Mutable data:
- the object header (e.g. refcount), as with all objects
- otherwise immutable objects:
- ob_type (
__class__
) - tp_base (
__base__
) - set byPyType_Ready()
if not set - tp_bases (
__bases__
) - always set byPyType_Ready()
- tp_mro (
__mro__
) - always set byPyType_Ready()
- tp_dict (
__dict__
) - set byPyType_Ready()
if not set
- ob_type (
- mutable containers:
- tp_subclasses (
__subclasses__
) - tp_weaklist
- tp_subclasses (
(See https://docs.python.org/3/c-api/typeobj.html#tp-slots.)
(Note that tp_cache
is no longer used.)
For the object header, if PEP 683 (immortal objects) is accepted then we can make static types immortal.
For the otherwise immutable objects, we can make sure each is immortal and then we're good. Even tp_dict
is fine since it gets hidden behind types.MappingProxyType
. We'd also need to either make sure each contained item is immortal.
For tp_subclasses
we will need a per-interpreter copy, and do the proper lookup in the __subclasses__
getter. The cache could be stored on PyInterpreterState
or even as a dict in tp_subclasses
.
For tp_weaklist
it's a similar story as for tp_subclasses
. Note that tp_weaklist
isn't very important for static types since they are never deallocated.
(The above is also discussed in PEP 684.)
Linked PRs
- gh-94673: Isolate the _io module to Each Interpreter #102663
- gh-94673: More Per-Interpreter Fields for Builtin Static Types #103912
- gh-94673: Ensure Builtin Static Types are Readied Properly #103940
- gh-94673: Fix _PyTypes_InitTypes() and get_type_attr_as_size() #103961
- gh-94673: Properly Initialize and Finalize Static Builtin Types for Each Interpreter #104072
- gh-94673: Hide Objects in PyTypeObject Behind Accessors #104074
- gh-94673: Ensure subtypes are readied only once in math.trunc() #105465
- [3.12] gh-94673: Ensure subtypes are readied only once in math.trunc() (gh-105465) #105471
- gh-94673: Clarify About Runtime State Related to Static Builtin Types #117761
- gh-94673: Fix compiler warning in typeobject.c #117980