Giampaolo Rodola: Wheels for free-threaded Python now available in psutil
With the release ofpsutil 7.1.2, wheels for free-threaded Python are now available. This milestone was achieved largely through acommunity effort, as several internal refactorings to the C code were required to make it possible (seeissue #2565). Many of these changes were contributed byLysandros Nikolaou. Thanks to him for the effort and for bearing with me in code reviews! ;-)
What is free-threaded Python?
Free-threaded Python (available sincePython 3.13) refers to Python builds that are compiled with theGIL (Global Interpreter Lock) disabled, allowing true parallel execution of Python bytecodes across multiple threads. This is particularly beneficial forCPU-bound applications, as it enables better utilization of multi-core processors.
The state of free-threaded wheels
According to Hugo van Kemenade'sfree-threaded wheels tracker, the adoption of free-threaded wheels among thetop 360 most-downloaded PyPI packages with C extensionsis still limited. Only128 out of these 360 packagesprovide wheels compiled for free-threaded Python, meaning they can run on Python builds with the GIL disabled. This shows that, while progress has been made, most popular packages with C extensions still do not offer ready-made wheels for free-threaded Python.
What it means for users
When a library author provides a wheel, users can install apre-compiled binary packagewithout having to build it from source. This is especially important for packages withC extensions, like psutil, which is largely written in C. Such packages often have complex build requirements and require a installing a C compiler. On Windows, that means installingVisual Studioor the Build Tools, which can take several gigabytes and asignificantsetup effort. Providing wheels spare users from this hassle, makes installation far simpler, and is effectivelyessential for the usersof that package. You basicallypip install psutiland you're done.
What it means for library authors
Currently,universal wheels for free-threaded Python do not exist. Each wheel must be built specifically for a Python version. Right now authors must create separate wheels for Python 3.13 and 3.14. Which means distributinga lotof files already:
This also multiplies CI jobs and slows down the test matrix (seebuild.yml). Atrue universal wheelwould greatly reduce this overhead, allowing a single wheel to support multiple Python versions and platforms. Hopefully,Python 3.15will simplify this process. Two competing proposals,PEP 803andPEP 809, aim to standardize wheel naming and metadata to allow producinga single wheel that cover multiple Python versions. That would drastically reduce distribution complexity for library authors, and it's fair to say it's essential for free-threaded CPython to truly succeed.
How to install free-threaded psutil
You can now install psutil for free-threaded Python directly viapip:
This ensures you get thepre-compiled wheelswithout triggering a source build.
https://gmpy.dev/blog/2025/wheels-for-free-threaded-python-now-available-in-psutil