Python 3.13 adds the ability to remove the Global Interpreter Lock (GIL) per PEP 703. Just this past week, a PR was merged in that allows the disabling of the GIL using a command line flag or an environment variable in free-threaded builds. Note that Python must be built using the Py_GIL_DISABLED
flag for this to work.
What is the GIL?
The Global Interpreter Lock makes threading easier in Python and prevents race conditions. It also makes running multiple threads per CPU core impossible. However, you can use the multiprocessing module to at least give you the ability to better utilize the cores on your CPU.
Removing the GIL
Removing the GIL will likely make Python buggy initially, so they are making the GIL-less version a build flag. That means that the GIL will still be on by default in Python 3.13 while they test the GIL-less version and find all the bugs the change causes. Hopefully, by 3.14 or so, they will know all the bugs and have them fixed to some degree or another.
Subinterpreters Are Coming
A related enhancement are subinterpreters, which Eric Snow has worked on for quite some time. PEP 554 and PEP 734 cover what subinterpreters are and how they are being exposed so you can use them.
Here’s the abstract from PEP 734 to give you an idea of what they are:
This PEP proposes to add a new module,
interpreters
, to support inspecting, creating, and running code in multiple interpreters in the current process. This includesInterpreter
objects that represent the underlying interpreters. The module will also provide a basicQueue
class for communication between interpreters. Finally, we will add a newconcurrent.futures.InterpreterPoolExecutor
based on theinterpreters
module.
Both of these enhancements have lots of potential for making Python code faster, more efficient, or both. Peter Sobot announced he tried out the GIL removal flag for the pedalboard package and got a 17x speed up for certain processes.