Python 3.15 gives free-threaded builds a stable ABI
Python 3.15, out October 9, adds a stable ABI for free-threaded CPython (PEP 803), so C extensions can ship one no-GIL wheel instead of rebuilding per version.
Python 3.15 arrived October 9 with a stable ABI for its free-threaded build, cataloged as PEP 803. It is the piece that was missing before no-GIL Python could be something a team reaches for on purpose rather than a benchmark to admire.

Start with the arc, because the single release makes more sense inside it. The free-threading project has shipped one load-bearing change a year. Version 3.13 made the interpreter runnable without the global interpreter lock in 2024, which proved the thing worked. Version 3.14 marked that build officially supported, which meant the core team would stand behind it. And 3.15 freezes the ABI, which is the change that lets the rest of the language catch up.
Here is why the ABI mattered more than the lock. A C extension compiled against CPython has to match the interpreter's binary interface, and until now a free-threaded extension had to be rebuilt for every minor version, because there was no stable contract to compile against. Most maintainers did not do that. The result was a no-GIL interpreter that ran pure Python across cores and then fell over the moment it imported NumPy. The wall was never the interpreter. It was the layer of compiled wheels behind it, and none of them could commit to a moving target.
The new stable ABI, tagged abi3t, is that commitment. An extension compiled once against it loads across minor versions of the free-threaded build, the way abi3 wheels already work for the regular build. NumPy, Pillow, cryptography, lxml and the rest of the native-extension set can now publish free-threaded wheels that survive a Python upgrade, which is the distance between a research toggle and something a platform team will standardize on.
The same release trims startup in ways that compound. Explicit lazy imports (PEP 810) defer a module until the first time its name is used, which matters for the command-line tools and short-lived workers that spend a measurable fraction of their life importing code they may never touch. A new sampling profiler called Tachyon (PEP 799) reads a running process at up to a million samples a second without a restart, so production performance work stops needing a special build. And UTF-8 is now the default text encoding regardless of the host locale (PEP 686), which ends a long genre of bug reports that only reproduced on one Windows machine in one region.
None of this makes free-threading the default. It is still opt-in, and the single-threaded interpreter is still what you get unless you ask for the other one. What changed is the cost of finding out whether the other one is for you.
The builder's read: upgrading to 3.15 breaks nothing, because the default build behaves as before, but the honest test has a new shape. Point a 3.15 free-threaded build at the real dependency list and read the install log. If the wheels a service needs now resolve, the no-GIL migration moved from a research ticket to a capacity plan worth writing this quarter. If some still fail, the gap is a short list of named packages with upstream issues to watch, instead of the whole language telling you no.
tags: #python #releases #free-threading