mirror of
https://github.com/python/cpython.git
synced 2026-02-22 07:00:51 +00:00
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Benedikt Johannes <benedikt.johannes.hofer@gmail.com>
470 lines
18 KiB
ReStructuredText
470 lines
18 KiB
ReStructuredText
.. highlight:: c
|
|
|
|
.. _sub-interpreter-support:
|
|
|
|
Multiple interpreters in a Python process
|
|
=========================================
|
|
|
|
While in most uses, you will only embed a single Python interpreter, there
|
|
are cases where you need to create several independent interpreters in the
|
|
same process and perhaps even in the same thread. Sub-interpreters allow
|
|
you to do that.
|
|
|
|
The "main" interpreter is the first one created when the runtime initializes.
|
|
It is usually the only Python interpreter in a process. Unlike sub-interpreters,
|
|
the main interpreter has unique process-global responsibilities like signal
|
|
handling. It is also responsible for execution during runtime initialization and
|
|
is usually the active interpreter during runtime finalization. The
|
|
:c:func:`PyInterpreterState_Main` function returns a pointer to its state.
|
|
|
|
You can switch between sub-interpreters using the :c:func:`PyThreadState_Swap`
|
|
function. You can create and destroy them using the following functions:
|
|
|
|
|
|
.. c:type:: PyInterpreterConfig
|
|
|
|
Structure containing most parameters to configure a sub-interpreter.
|
|
Its values are used only in :c:func:`Py_NewInterpreterFromConfig` and
|
|
never modified by the runtime.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
Structure fields:
|
|
|
|
.. c:member:: int use_main_obmalloc
|
|
|
|
If this is ``0`` then the sub-interpreter will use its own
|
|
"object" allocator state.
|
|
Otherwise it will use (share) the main interpreter's.
|
|
|
|
If this is ``0`` then
|
|
:c:member:`~PyInterpreterConfig.check_multi_interp_extensions`
|
|
must be ``1`` (non-zero).
|
|
If this is ``1`` then :c:member:`~PyInterpreterConfig.gil`
|
|
must not be :c:macro:`PyInterpreterConfig_OWN_GIL`.
|
|
|
|
.. c:member:: int allow_fork
|
|
|
|
If this is ``0`` then the runtime will not support forking the
|
|
process in any thread where the sub-interpreter is currently active.
|
|
Otherwise fork is unrestricted.
|
|
|
|
Note that the :mod:`subprocess` module still works
|
|
when fork is disallowed.
|
|
|
|
.. c:member:: int allow_exec
|
|
|
|
If this is ``0`` then the runtime will not support replacing the
|
|
current process via exec (e.g. :func:`os.execv`) in any thread
|
|
where the sub-interpreter is currently active.
|
|
Otherwise exec is unrestricted.
|
|
|
|
Note that the :mod:`subprocess` module still works
|
|
when exec is disallowed.
|
|
|
|
.. c:member:: int allow_threads
|
|
|
|
If this is ``0`` then the sub-interpreter's :mod:`threading` module
|
|
won't create threads.
|
|
Otherwise threads are allowed.
|
|
|
|
.. c:member:: int allow_daemon_threads
|
|
|
|
If this is ``0`` then the sub-interpreter's :mod:`threading` module
|
|
won't create daemon threads.
|
|
Otherwise daemon threads are allowed (as long as
|
|
:c:member:`~PyInterpreterConfig.allow_threads` is non-zero).
|
|
|
|
.. c:member:: int check_multi_interp_extensions
|
|
|
|
If this is ``0`` then all extension modules may be imported,
|
|
including legacy (single-phase init) modules,
|
|
in any thread where the sub-interpreter is currently active.
|
|
Otherwise only multi-phase init extension modules
|
|
(see :pep:`489`) may be imported.
|
|
(Also see :c:macro:`Py_mod_multiple_interpreters`.)
|
|
|
|
This must be ``1`` (non-zero) if
|
|
:c:member:`~PyInterpreterConfig.use_main_obmalloc` is ``0``.
|
|
|
|
.. c:member:: int gil
|
|
|
|
This determines the operation of the GIL for the sub-interpreter.
|
|
It may be one of the following:
|
|
|
|
.. c:namespace:: NULL
|
|
|
|
.. c:macro:: PyInterpreterConfig_DEFAULT_GIL
|
|
|
|
Use the default selection (:c:macro:`PyInterpreterConfig_SHARED_GIL`).
|
|
|
|
.. c:macro:: PyInterpreterConfig_SHARED_GIL
|
|
|
|
Use (share) the main interpreter's GIL.
|
|
|
|
.. c:macro:: PyInterpreterConfig_OWN_GIL
|
|
|
|
Use the sub-interpreter's own GIL.
|
|
|
|
If this is :c:macro:`PyInterpreterConfig_OWN_GIL` then
|
|
:c:member:`PyInterpreterConfig.use_main_obmalloc` must be ``0``.
|
|
|
|
|
|
.. c:function:: PyStatus Py_NewInterpreterFromConfig(PyThreadState **tstate_p, const PyInterpreterConfig *config)
|
|
|
|
.. index::
|
|
pair: module; builtins
|
|
pair: module; __main__
|
|
pair: module; sys
|
|
single: stdout (in module sys)
|
|
single: stderr (in module sys)
|
|
single: stdin (in module sys)
|
|
|
|
Create a new sub-interpreter. This is an (almost) totally separate environment
|
|
for the execution of Python code. In particular, the new interpreter has
|
|
separate, independent versions of all imported modules, including the
|
|
fundamental modules :mod:`builtins`, :mod:`__main__` and :mod:`sys`. The
|
|
table of loaded modules (``sys.modules``) and the module search path
|
|
(``sys.path``) are also separate. The new environment has no ``sys.argv``
|
|
variable. It has new standard I/O stream file objects ``sys.stdin``,
|
|
``sys.stdout`` and ``sys.stderr`` (however these refer to the same underlying
|
|
file descriptors).
|
|
|
|
The given *config* controls the options with which the interpreter
|
|
is initialized.
|
|
|
|
Upon success, *tstate_p* will be set to the first :term:`thread state`
|
|
created in the new sub-interpreter. This thread state is
|
|
:term:`attached <attached thread state>`.
|
|
Note that no actual thread is created; see the discussion of thread states
|
|
below. If creation of the new interpreter is unsuccessful,
|
|
*tstate_p* is set to ``NULL``;
|
|
no exception is set since the exception state is stored in the
|
|
:term:`attached thread state`, which might not exist.
|
|
|
|
Like all other Python/C API functions, an :term:`attached thread state`
|
|
must be present before calling this function, but it might be detached upon
|
|
returning. On success, the returned thread state will be :term:`attached <attached thread state>`.
|
|
If the sub-interpreter is created with its own :term:`GIL` then the
|
|
:term:`attached thread state` of the calling interpreter will be detached.
|
|
When the function returns, the new interpreter's :term:`thread state`
|
|
will be :term:`attached <attached thread state>` to the current thread and
|
|
the previous interpreter's :term:`attached thread state` will remain detached.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
Sub-interpreters are most effective when isolated from each other,
|
|
with certain functionality restricted::
|
|
|
|
PyInterpreterConfig config = {
|
|
.use_main_obmalloc = 0,
|
|
.allow_fork = 0,
|
|
.allow_exec = 0,
|
|
.allow_threads = 1,
|
|
.allow_daemon_threads = 0,
|
|
.check_multi_interp_extensions = 1,
|
|
.gil = PyInterpreterConfig_OWN_GIL,
|
|
};
|
|
PyThreadState *tstate = NULL;
|
|
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
|
|
if (PyStatus_Exception(status)) {
|
|
Py_ExitStatusException(status);
|
|
}
|
|
|
|
Note that the config is used only briefly and does not get modified.
|
|
During initialization the config's values are converted into various
|
|
:c:type:`PyInterpreterState` values. A read-only copy of the config
|
|
may be stored internally on the :c:type:`PyInterpreterState`.
|
|
|
|
.. index::
|
|
single: Py_FinalizeEx (C function)
|
|
single: Py_Initialize (C function)
|
|
|
|
Extension modules are shared between (sub-)interpreters as follows:
|
|
|
|
* For modules using multi-phase initialization,
|
|
e.g. :c:func:`PyModule_FromDefAndSpec`, a separate module object is
|
|
created and initialized for each interpreter.
|
|
Only C-level static and global variables are shared between these
|
|
module objects.
|
|
|
|
* For modules using legacy
|
|
:ref:`single-phase initialization <single-phase-initialization>`,
|
|
e.g. :c:func:`PyModule_Create`, the first time a particular extension
|
|
is imported, it is initialized normally, and a (shallow) copy of its
|
|
module's dictionary is squirreled away.
|
|
When the same extension is imported by another (sub-)interpreter, a new
|
|
module is initialized and filled with the contents of this copy; the
|
|
extension's ``init`` function is not called.
|
|
Objects in the module's dictionary thus end up shared across
|
|
(sub-)interpreters, which might cause unwanted behavior (see
|
|
`Bugs and caveats`_ below).
|
|
|
|
Note that this is different from what happens when an extension is
|
|
imported after the interpreter has been completely re-initialized by
|
|
calling :c:func:`Py_FinalizeEx` and :c:func:`Py_Initialize`; in that
|
|
case, the extension's ``initmodule`` function *is* called again.
|
|
As with multi-phase initialization, this means that only C-level static
|
|
and global variables are shared between these modules.
|
|
|
|
.. index:: single: close (in module os)
|
|
|
|
|
|
.. c:function:: PyThreadState* Py_NewInterpreter(void)
|
|
|
|
.. index::
|
|
pair: module; builtins
|
|
pair: module; __main__
|
|
pair: module; sys
|
|
single: stdout (in module sys)
|
|
single: stderr (in module sys)
|
|
single: stdin (in module sys)
|
|
|
|
Create a new sub-interpreter. This is essentially just a wrapper
|
|
around :c:func:`Py_NewInterpreterFromConfig` with a config that
|
|
preserves the existing behavior. The result is an unisolated
|
|
sub-interpreter that shares the main interpreter's GIL, allows
|
|
fork/exec, allows daemon threads, and allows single-phase init
|
|
modules.
|
|
|
|
|
|
.. c:function:: void Py_EndInterpreter(PyThreadState *tstate)
|
|
|
|
.. index:: single: Py_FinalizeEx (C function)
|
|
|
|
Destroy the (sub-)interpreter represented by the given :term:`thread state`.
|
|
The given thread state must be :term:`attached <attached thread state>`.
|
|
When the call returns, there will be no :term:`attached thread state`.
|
|
All thread states associated with this interpreter are destroyed.
|
|
|
|
:c:func:`Py_FinalizeEx` will destroy all sub-interpreters that
|
|
haven't been explicitly destroyed at that point.
|
|
|
|
|
|
.. _per-interpreter-gil:
|
|
|
|
A per-interpreter GIL
|
|
---------------------
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
Using :c:func:`Py_NewInterpreterFromConfig` you can create
|
|
a sub-interpreter that is completely isolated from other interpreters,
|
|
including having its own GIL. The most important benefit of this
|
|
isolation is that such an interpreter can execute Python code without
|
|
being blocked by other interpreters or blocking any others. Thus a
|
|
single Python process can truly take advantage of multiple CPU cores
|
|
when running Python code. The isolation also encourages a different
|
|
approach to concurrency than that of just using threads.
|
|
(See :pep:`554` and :pep:`684`.)
|
|
|
|
Using an isolated interpreter requires vigilance in preserving that
|
|
isolation. That especially means not sharing any objects or mutable
|
|
state without guarantees about thread-safety. Even objects that are
|
|
otherwise immutable (e.g. ``None``, ``(1, 5)``) can't normally be shared
|
|
because of the refcount. One simple but less-efficient approach around
|
|
this is to use a global lock around all use of some state (or object).
|
|
Alternately, effectively immutable objects (like integers or strings)
|
|
can be made safe in spite of their refcounts by making them :term:`immortal`.
|
|
In fact, this has been done for the builtin singletons, small integers,
|
|
and a number of other builtin objects.
|
|
|
|
If you preserve isolation then you will have access to proper multi-core
|
|
computing without the complications that come with free-threading.
|
|
Failure to preserve isolation will expose you to the full consequences
|
|
of free-threading, including races and hard-to-debug crashes.
|
|
|
|
Aside from that, one of the main challenges of using multiple isolated
|
|
interpreters is how to communicate between them safely (not break
|
|
isolation) and efficiently. The runtime and stdlib do not provide
|
|
any standard approach to this yet. A future stdlib module would help
|
|
mitigate the effort of preserving isolation and expose effective tools
|
|
for communicating (and sharing) data between interpreters.
|
|
|
|
|
|
Bugs and caveats
|
|
----------------
|
|
|
|
Because sub-interpreters (and the main interpreter) are part of the same
|
|
process, the insulation between them isn't perfect --- for example, using
|
|
low-level file operations like :func:`os.close` they can
|
|
(accidentally or maliciously) affect each other's open files. Because of the
|
|
way extensions are shared between (sub-)interpreters, some extensions may not
|
|
work properly; this is especially likely when using single-phase initialization
|
|
or (static) global variables.
|
|
It is possible to insert objects created in one sub-interpreter into
|
|
a namespace of another (sub-)interpreter; this should be avoided if possible.
|
|
|
|
Special care should be taken to avoid sharing user-defined functions,
|
|
methods, instances or classes between sub-interpreters, since import
|
|
operations executed by such objects may affect the wrong (sub-)interpreter's
|
|
dictionary of loaded modules. It is equally important to avoid sharing
|
|
objects from which the above are reachable.
|
|
|
|
Also note that combining this functionality with ``PyGILState_*`` APIs
|
|
is delicate, because these APIs assume a bijection between Python thread states
|
|
and OS-level threads, an assumption broken by the presence of sub-interpreters.
|
|
It is highly recommended that you don't switch sub-interpreters between a pair
|
|
of matching :c:func:`PyGILState_Ensure` and :c:func:`PyGILState_Release` calls.
|
|
Furthermore, extensions (such as :mod:`ctypes`) using these APIs to allow calling
|
|
of Python code from non-Python created threads will probably be broken when using
|
|
sub-interpreters.
|
|
|
|
|
|
High-level APIs
|
|
---------------
|
|
|
|
.. c:type:: PyInterpreterState
|
|
|
|
This data structure represents the state shared by a number of cooperating
|
|
threads. Threads belonging to the same interpreter share their module
|
|
administration and a few other internal items. There are no public members in
|
|
this structure.
|
|
|
|
Threads belonging to different interpreters initially share nothing, except
|
|
process state like available memory, open file descriptors and such. The global
|
|
interpreter lock is also shared by all threads, regardless of to which
|
|
interpreter they belong.
|
|
|
|
.. versionchanged:: 3.12
|
|
|
|
:pep:`684` introduced the possibility
|
|
of a :ref:`per-interpreter GIL <per-interpreter-gil>`.
|
|
See :c:func:`Py_NewInterpreterFromConfig`.
|
|
|
|
|
|
.. c:function:: PyInterpreterState* PyInterpreterState_Get(void)
|
|
|
|
Get the current interpreter.
|
|
|
|
Issue a fatal error if there is no :term:`attached thread state`.
|
|
It cannot return NULL.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. c:function:: int64_t PyInterpreterState_GetID(PyInterpreterState *interp)
|
|
|
|
Return the interpreter's unique ID. If there was any error in doing
|
|
so then ``-1`` is returned and an error is set.
|
|
|
|
The caller must have an :term:`attached thread state`.
|
|
|
|
.. versionadded:: 3.7
|
|
|
|
|
|
.. c:function:: PyObject* PyInterpreterState_GetDict(PyInterpreterState *interp)
|
|
|
|
Return a dictionary in which interpreter-specific data may be stored.
|
|
If this function returns ``NULL`` then no exception has been raised and
|
|
the caller should assume no interpreter-specific dict is available.
|
|
|
|
This is not a replacement for :c:func:`PyModule_GetState()`, which
|
|
extensions should use to store interpreter-specific state information.
|
|
|
|
The returned dictionary is borrowed from the interpreter and is valid until
|
|
interpreter shutdown.
|
|
|
|
.. versionadded:: 3.8
|
|
|
|
|
|
.. c:type:: PyObject* (*_PyFrameEvalFunction)(PyThreadState *tstate, _PyInterpreterFrame *frame, int throwflag)
|
|
|
|
Type of a frame evaluation function.
|
|
|
|
The *throwflag* parameter is used by the ``throw()`` method of generators:
|
|
if non-zero, handle the current exception.
|
|
|
|
.. versionchanged:: 3.9
|
|
The function now takes a *tstate* parameter.
|
|
|
|
.. versionchanged:: 3.11
|
|
The *frame* parameter changed from ``PyFrameObject*`` to ``_PyInterpreterFrame*``.
|
|
|
|
|
|
.. c:function:: _PyFrameEvalFunction _PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp)
|
|
|
|
Get the frame evaluation function.
|
|
|
|
See the :pep:`523` "Adding a frame evaluation API to CPython".
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. c:function:: void _PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp, _PyFrameEvalFunction eval_frame)
|
|
|
|
Set the frame evaluation function.
|
|
|
|
See the :pep:`523` "Adding a frame evaluation API to CPython".
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
Low-level APIs
|
|
--------------
|
|
|
|
All of the following functions must be called after :c:func:`Py_Initialize`.
|
|
|
|
.. versionchanged:: 3.7
|
|
:c:func:`Py_Initialize()` now initializes the :term:`GIL`
|
|
and sets an :term:`attached thread state`.
|
|
|
|
|
|
.. c:function:: PyInterpreterState* PyInterpreterState_New()
|
|
|
|
Create a new interpreter state object. An :term:`attached thread state` is not needed,
|
|
but may optionally exist if it is necessary to serialize calls to this
|
|
function.
|
|
|
|
.. audit-event:: cpython.PyInterpreterState_New "" c.PyInterpreterState_New
|
|
|
|
|
|
.. c:function:: void PyInterpreterState_Clear(PyInterpreterState *interp)
|
|
|
|
Reset all information in an interpreter state object. There must be
|
|
an :term:`attached thread state` for the interpreter.
|
|
|
|
.. audit-event:: cpython.PyInterpreterState_Clear "" c.PyInterpreterState_Clear
|
|
|
|
|
|
.. c:function:: void PyInterpreterState_Delete(PyInterpreterState *interp)
|
|
|
|
Destroy an interpreter state object. There **should not** be an
|
|
:term:`attached thread state` for the target interpreter. The interpreter
|
|
state must have been reset with a previous call to :c:func:`PyInterpreterState_Clear`.
|
|
|
|
|
|
.. _advanced-debugging:
|
|
|
|
Advanced debugger support
|
|
-------------------------
|
|
|
|
These functions are only intended to be used by advanced debugging tools.
|
|
|
|
|
|
.. c:function:: PyInterpreterState* PyInterpreterState_Head()
|
|
|
|
Return the interpreter state object at the head of the list of all such objects.
|
|
|
|
|
|
.. c:function:: PyInterpreterState* PyInterpreterState_Main()
|
|
|
|
Return the main interpreter state object.
|
|
|
|
|
|
.. c:function:: PyInterpreterState* PyInterpreterState_Next(PyInterpreterState *interp)
|
|
|
|
Return the next interpreter state object after *interp* from the list of all
|
|
such objects.
|
|
|
|
|
|
.. c:function:: PyThreadState * PyInterpreterState_ThreadHead(PyInterpreterState *interp)
|
|
|
|
Return the pointer to the first :c:type:`PyThreadState` object in the list of
|
|
threads associated with the interpreter *interp*.
|
|
|
|
|
|
.. c:function:: PyThreadState* PyThreadState_Next(PyThreadState *tstate)
|
|
|
|
Return the next thread state object after *tstate* from the list of all such
|
|
objects belonging to the same :c:type:`PyInterpreterState` object.
|