Rückblick auf das erste Jahr von Free-Threaded Python
(labs.quansight.org)- Free-Threaded Python wurde so konzipiert, dass es Multicore-Hardware effizient nutzen kann
- In CPython 3.14 wurden Thread-Sicherheit und Performance zentraler Module deutlich verbessert
- Es gibt weiterhin viele wichtige Pakete, die Free-Threaded-Builds noch nicht unterstützen
- Alle können durch Berichte aus realen Einsatzumgebungen und Beiträge aus der Community zur Weiterentwicklung beitragen
Überblick
Letzte Woche wurde CPython 3.14.0b1 veröffentlicht, und in dieser Woche beginnt PyCon 2025 in Pittsburgh.
Diese beiden Ereignisse sind wichtige Meilensteine für die Bereitstellung und Stabilisierung von Free-Threaded Python.
Dieser Beitrag blickt auf das vergangene Jahr zurück und erklärt, wie das Team von Quansight eine Schlüsselrolle dabei spielte, den Free-Threaded-Build experimentell auf reale Produktions-Workflows mit komplexen Abhängigkeiten anzuwenden.
Bedeutung und Notwendigkeit von Free-Threaded Python
- Die Unterstützung für Free-Threaded Python ermöglicht die volle Nutzung der Rechenressourcen moderner Hardware, auf der Multicore-CPUs und GPUs allgegenwärtig sind
- Beim bisherigen GIL-Ansatz (Global Interpreter Lock) waren Umgehungslösungen und zusätzliches Tuning nötig, um parallele Algorithmen vollständig zu nutzen
- Statt des Moduls threading wurde meist multiprocessing verwendet, doch das verursacht hohe Prozess-Startkosten und ist auch bei Datenkopien ineffizient
- Wenn Python-Pakete nativen Code enthalten, sind sie nicht automatisch mit Free-Threaded-Builds kompatibel; zur Gewährleistung von Thread-Sicherheit ist daher zwingend ein Code-Audit erforderlich
- Die Entfernung des GIL erforderte tiefgreifende strukturelle Änderungen am CPython-Interpreter und legte zugleich strukturelle Probleme bestehender Pakete offen
Wichtige Erfolge
- Gemeinsam mit dem Python-Runtime-Team von Meta wurden Beiträge zur Unterstützung von Free-Threaded Python in verschiedenen Paketen und Projekten geleistet, darunter:
- Packaging- und Workflow-Tools wie meson, meson-python, setup-python GitHub Actions, packaging, pip und setuptools
- Binding-Generatoren wie Cython, pybind11, f2py und PyO3
- Zentrale Pakete des PyData-Ökosystems wie NumPy, SciPy, PyArrow, Matplotlib, pandas, scikit-learn und scikit-image
- Wichtige stark nachgefragte Abhängigkeiten auf PyPI wie Pillow, PyYAML, yarl, multidict und frozenlist
- An beliebten Paketen ohne Unterstützung (CFFI, cryptography, PyNaCl, aiohttp, SQLAlchemy, grpcio usw.) sowie an Machine-Learning-Bibliotheken (safetensors, tokenizers usw.) wird schrittweise weitergearbeitet
- Die CPython-Core-Entwickler im Quansight-Team haben für Version 3.14 unter anderem folgende Verbesserungen eingebracht:
- Das Modul warnings arbeitet in Free-Threaded-Builds standardmäßig thread-sicher
- Schwerwiegende Probleme bei der Thread-Sicherheit von asyncio wurden verbessert und die parallele Skalierbarkeit erhöht
- Umfassende Verbesserungen der Thread-Sicherheit im ctypes-Modul
- Leistungsverbesserungen beim Free-Threaded-Garbage Collector
- Optimierungen des Schemas deferred reference counting und des adaptive specializing interpreter
- Zahlreiche Bugfixes und zusätzliche Verbesserungen der Thread-Sicherheit
- Außerdem wurde ein umfassender Leitfaden1 für die Unterstützung von Free-Threaded Python erstellt, der künftig für noch mehr Pakete als praxisnahe Dokumentation dienen kann
Stand des Free-Threaded-Python-Ökosystems
- Vor einem Jahr (zum Zeitpunkt der Veröffentlichung von 3.13.0b1) war die Installation der meisten Python-Pakete auf Free-Threaded-Builds grundsätzlich kaputt
- Die Ursachen für Build-Fehler waren meist keine fundamentalen Probleme, sondern nicht unterstützte Standardoptionen oder kleine Annahmen, die nicht mehr galten
- Im vergangenen Jahr wurden gemeinsam mit der Community viele Probleme behoben; insbesondere die offizielle Unterstützung in Cython 3.1.0 war ein großer Wendepunkt
- Noch immer gibt es Pakete mit kompiliertem Code, die jedoch keine Free-Threaded-Wheels bereitstellen.
Ihr Fortschritt lässt sich in manuell und automatisch gepflegten Tracking-Tabellen2 verfolgen
Aktuelle Herausforderungen
- Derzeit befinden sich Free-Threaded-Python-Builds in einer Phase, in der Experimente und Feedback aus realen Workflows benötigt werden
- Gerade bei Workflows mit hohen Kosten für die Nutzung von Multiprocessing ist Performance-Gewinn möglich, doch dafür sind detaillierte Audits zur Thread-Sicherheit jedes Pakets unverzichtbar
- Viele Bibliotheken stellen mutierbare Datenstrukturen bereit, ohne Thread-Sicherheit ausreichend zu dokumentieren oder tatsächlich zu garantieren
- Bei großen Paketen mit viel Legacy-Code verzögert sich die Unterstützung oft, weil es an Menschen fehlt, die den Code vollständig überblicken können
- Auf Community-Ebene sind Anstrengungen nötig, um die Nachhaltigkeit der Wartung zentraler Pakete zu sichern
Wie man beitragen kann
- Das offizielle Handbuch mit dem Leitfaden für Beiträge kann als Einstieg dienen
- Ökosystemweite Issues und zentrale Kompatibilitätsdokumente werden im Repository free-threaded-compatibility5 gepflegt
- Diskussionen und Beiträge sind auch über den von Quansight-Labs betreuten Community-Discord6 möglich
Ankündigung zum geplanten PyCon-Vortrag
- Der Autor des Beitrags und sein Teamkollege Lysandros Nikolaou werden auf der PyCon 2025 sprechen
- Geplant ist, praxisnahe Portierungsbeispiele und Know-how aus eigener Erfahrung zu teilen; außerdem soll eine Aufzeichnung auf YouTube bereitgestellt werden
- Man ist überzeugt, dass Free-Threaded-Builds die Zukunft der Python-Sprache sind, und freut sich darauf, zu ihrer Verwirklichung beizutragen
- Die Hoffnung ist, dass die heutigen Bemühungen zu einem Wendepunkt für die Zukunft der vielfältigen und umfangreichen Pakete werden, die täglich von Millionen Entwicklern genutzt werden
1 Kommentare
Hacker-News-Kommentare
Viele nutzen Multiprocessing und weisen darauf hin, dass das Erzeugen von Prozessen teuer ist
Es gibt die Funktion
SharedMemory, und es ist unklar, warum sie nicht häufiger genutzt wirdEs wird betont, dass die Erfahrungen mit
ShareableListgut warenUnter Unix liegt die Geschwindigkeit der Prozesserzeugung bei unter 1 ms
PYTHON-Interpreterprozesses kann jedoch je nach Anzahl der Imports 30 ms bis 300 ms dauernShareableListkann nur atomare Skalare sowie Bytes und Strings gemeinsam nutzenpickle dumpsowie durch prozessweise duplizierten SpeicherEs wurden große Erfolge beim Teilen von NumPy-Arrays erzielt
segfaults debuggt werden müssenProzesse sterben unabhängig voneinander; wenn also ein Prozess stirbt, während er mit gehaltenem Lock eine Shared-Memory-Datenstruktur verändert, ist die Wiederherstellung schwierig
Shared Memory funktioniert nur auf dedizierter Hardware
forkbringt andere Probleme mit sichEs wird gefragt, ob das Entfernen des GIL außer echter Parallelisierung noch andere Auswirkungen auf multithreadeten Python-Code hat
Das Verständnis ist, dass der GIL nicht deshalb beibehalten wurde, weil Multithreading auf ihn angewiesen wäre, sondern weil seine Entfernung die Implementierung des Interpreters und der C-Erweiterungen erschwert und Single-Thread-Code verlangsamt
Es wird gefragt, ob Free-Threaded Python weiterhin dieselbe bisherige Garantie bietet, an Bytecode-Grenzen jederzeit präemptiert werden zu können
Oder ob man anders programmieren muss, etwa mit mehr Locks
Free-Threaded Python bietet größtenteils dieselben Garantien
Mehrkernnutzung ist möglich, allerdings bei geringerer Leistung pro Thread und nötiger Überarbeitung von Bibliotheken
Race Conditions könnten häufiger auftreten, daher ist beim Schreiben von multithreadetem Python mehr Sorgfalt nötig, wenn Zuverlässigkeit garantiert werden soll
Es wird berichtet, dass Microsoft das Faster-Python-Team aufgelöst hat
Offenbar wurde das Team wegen verfehlter Erwartungen an die Geschäftszahlen 2025 nicht weitergeführt
Es bleibt abzuwarten, ob weitere Performance-Verbesserungen in CPython einfließen oder ob andere Unternehmen die Förderung übernehmen
Facebook (Meta) scheint weiterhin teilweise zu fördern
Es wird erwähnt, dass Microsofts Zeitplan im Vergleich zu seinen Zusagen stark in Verzug geraten sei
Dieses Ergebnis sei zwar bedauerlich, bestätige aber die eigene Erwartung, Microsofts langfristigen Zusagen nicht zu trauen
Kürzlich habe es auch das Gerücht gegeben, Google habe sein gesamtes Python-Entwicklungsteam entlassen
Sehr bedauerlich, aber mit einer Anspielung darauf, dass nach „embrace & extend“ nur noch eines übrig bleibe
Es wird gefragt, ob man mit der Sorge über das Verschwinden des GIL in Python allein ist
Komplexem Multithreading-Code in beliebigen Sprachen sei schwer zu vertrauen, und bei Python sei das wegen seiner dynamischen Natur besonders beunruhigend
Man sei mit der Angst vor der Veränderung nicht allein, auch wenn die Begründung irrational sein könne
asyncstatt Threads verwendetMan selbst nutzt
asyncioaktivEs wird erwartet, dass es wie im ML/AI-Bereich läuft: Experten bauen zuerst komplexe Bibliotheken und reichen sie dann an normale Nutzer weiter
Es könnte unnötige Angst schüren, aber es wird daran erinnert, dass LLMs mit Python-Code trainiert wurden, der von der jahrzehntelangen Existenz des GIL ausging
Ob der GIL vorhanden ist oder nicht, betrifft nur jene, die Multicore-Arbeit wollen
Jemand nutzt Python oft, ist aber kein Experte, und startet gelegentlich mit
concurrent.futuresmehrere einfache Funktionen gleichzeitigEs wird gefragt, was solche Nutzer künftig ändern müssen
Threads sind nicht mehr an den GIL gebunden und werden insgesamt schneller
Es werden Eindrücke aus 20 Jahren professioneller Python-Erfahrung geteilt
Echte Threads seien nur dann wirklich nötig, wenn Message Passing unvermeidbar ist
Jemand mit ähnlich langer Python-Erfahrung stimmt zu, formuliert es aber etwas anders
asyncausdrücklich empfohlen (Glyph, du hattest recht!)Es wird angemerkt, dass das Bild zwar KI-generiert sei, aber merkwürdigerweise eine Schlange mit zwei Schwänzen zeige
Eine scherzhafte Zustimmung empfiehlt, das stillschweigend zu übergehen; wenn in einem Python-Artikel eine Schlangenillustration auftaucht, sei das meist ohnehin ein Zeichen, dem man spielerisch keine große Aufmerksamkeit schenken müsse
Als Witz wird der Name „Confusoborus“ vorgeschlagen
Es wird darauf hingewiesen, dass die Schlange im Header-Bild zwei Schwänze zu haben scheint
Es wird gefragt, ob es abgesehen von der Bibliotheksunterstützung weitere Einschränkungen gibt, WSGI und Celery-Worker in einem einzelnen Prozess zu betreiben
Es wird als enorme Grundlagenarbeit für das kommende Performance-Zeitalter betrachtet