| .. _freethreading-python-howto: | |
| ********************************************** | |
| Python experimental support for free threading | |
| ********************************************** | |
| Starting with the 3.13 release, CPython has experimental support for a build of | |
| Python called :term:`free threading` where the :term:`global interpreter lock` | |
| (GIL) is disabled. Free-threaded execution allows for full utilization of the | |
| available processing power by running threads in parallel on available CPU cores. | |
| While not all software will benefit from this automatically, programs | |
| designed with threading in mind will run faster on multi-core hardware. | |
| **The free-threaded mode is experimental** and work is ongoing to improve it: | |
| expect some bugs and a substantial single-threaded performance hit. | |
| This document describes the implications of free threading | |
| for Python code. See :ref:`freethreading-extensions-howto` for information on | |
| how to write C extensions that support the free-threaded build. | |
| .. seealso:: | |
| :pep:`703` – Making the Global Interpreter Lock Optional in CPython for an | |
| overall description of free-threaded Python. | |
| Installation | |
| ============ | |
| Starting with Python 3.13, the official macOS and Windows installers | |
| optionally support installing free-threaded Python binaries. The installers | |
| are available at https://www.python.org/downloads/. | |
| For information on other platforms, see the `Installing a Free-Threaded Python | |
| <https://py-free-threading.github.io/installing_cpython/>`_, a | |
| community-maintained installation guide for installing free-threaded Python. | |
| When building CPython from source, the :option:`--disable-gil` configure option | |
| should be used to build a free-threaded Python interpreter. | |
| Identifying free-threaded Python | |
| ================================ | |
| To check if the current interpreter supports free-threading, :option:`python -VV <-V>` | |
| and :attr:`sys.version` contain "experimental free-threading build". | |
| The new :func:`sys._is_gil_enabled` function can be used to check whether | |
| the GIL is actually disabled in the running process. | |
| The ``sysconfig.get_config_var("Py_GIL_DISABLED")`` configuration variable can | |
| be used to determine whether the build supports free threading. If the variable | |
| is set to ``1``, then the build supports free threading. This is the recommended | |
| mechanism for decisions related to the build configuration. | |
| The global interpreter lock in free-threaded Python | |
| =================================================== | |
| Free-threaded builds of CPython support optionally running with the GIL enabled | |
| at runtime using the environment variable :envvar:`PYTHON_GIL` or | |
| the command-line option :option:`-X gil`. | |
| The GIL may also automatically be enabled when importing a C-API extension | |
| module that is not explicitly marked as supporting free threading. A warning | |
| will be printed in this case. | |
| In addition to individual package documentation, the following websites track | |
| the status of popular packages support for free threading: | |
| * https://py-free-threading.github.io/tracking/ | |
| * https://hugovk.github.io/free-threaded-wheels/ | |
| Thread safety | |
| ============= | |
| The free-threaded build of CPython aims to provide similar thread-safety | |
| behavior at the Python level to the default GIL-enabled build. Built-in | |
| types like :class:`dict`, :class:`list`, and :class:`set` use internal locks | |
| to protect against concurrent modifications in ways that behave similarly to | |
| the GIL. However, Python has not historically guaranteed specific behavior for | |
| concurrent modifications to these built-in types, so this should be treated | |
| as a description of the current implementation, not a guarantee of current or | |
| future behavior. | |
| .. note:: | |
| It's recommended to use the :class:`threading.Lock` or other synchronization | |
| primitives instead of relying on the internal locks of built-in types, when | |
| possible. | |
| Known limitations | |
| ================= | |
| This section describes known limitations of the free-threaded CPython build. | |
| Immortalization | |
| --------------- | |
| The free-threaded build of the 3.13 release makes some objects :term:`immortal`. | |
| Immortal objects are not deallocated and have reference counts that are | |
| never modified. This is done to avoid reference count contention that would | |
| prevent efficient multi-threaded scaling. | |
| An object will be made immortal when a new thread is started for the first time | |
| after the main thread is running. The following objects are immortalized: | |
| * :ref:`function <user-defined-funcs>` objects declared at the module level | |
| * :ref:`method <instance-methods>` descriptors | |
| * :ref:`code <code-objects>` objects | |
| * :term:`module` objects and their dictionaries | |
| * :ref:`classes <classes>` (type objects) | |
| Because immortal objects are never deallocated, applications that create many | |
| objects of these types may see increased memory usage. This is expected to be | |
| addressed in the 3.14 release. | |
| Additionally, numeric and string literals in the code as well as strings | |
| returned by :func:`sys.intern` are also immortalized. This behavior is | |
| expected to remain in the 3.14 free-threaded build. | |
| Frame objects | |
| ------------- | |
| It is not safe to access :ref:`frame <frame-objects>` objects from other | |
| threads and doing so may cause your program to crash . This means that | |
| :func:`sys._current_frames` is generally not safe to use in a free-threaded | |
| build. Functions like :func:`inspect.currentframe` and :func:`sys._getframe` | |
| are generally safe as long as the resulting frame object is not passed to | |
| another thread. | |
| Iterators | |
| --------- | |
| Sharing the same iterator object between multiple threads is generally not | |
| safe and threads may see duplicate or missing elements when iterating or crash | |
| the interpreter. | |
| Single-threaded performance | |
| --------------------------- | |
| The free-threaded build has additional overhead when executing Python code | |
| compared to the default GIL-enabled build. In 3.13, this overhead is about | |
| 40% on the `pyperformance <https://pyperformance.readthedocs.io/>`_ suite. | |
| Programs that spend most of their time in C extensions or I/O will see | |
| less of an impact. The largest impact is because the specializing adaptive | |
| interpreter (:pep:`659`) is disabled in the free-threaded build. We expect | |
| to re-enable it in a thread-safe way in the 3.14 release. This overhead is | |
| expected to be reduced in upcoming Python release. We are aiming for an | |
| overhead of 10% or less on the pyperformance suite compared to the default | |
| GIL-enabled build. |