GIL removal in Python 1.4
Verfasst: Samstag 13. August 2011, 11:33
Dave Beazley hat einen interessanten Artikel geschrieben, der einen 15 Jahre alten Path für Python 1.4 erklärt, mit dem man damals den Global Interpreter Lock (GIL) entfernen hätte können. Der Patch verlangsamt unglücklicherweise (wie auch alle anderen Versuche danach) Python, wenn es nur auf einem Prozessor läuft, sodass er letztlich nicht benutzt wurde.
Interessant finde ich die Erkenntnis, dass fast vollständig das Reference Counting (das gegen racing conditions bei mehreren Threads gesichert werden muss)für die Verlangsamung verantwortlich ist. Würde man dieses ausbauen, wäre viel gewonnen. Leider würden dann die meisten C-Extensions nicht mehr funktionieren. Sie müssten alle im Hinblick auf einen "richtigen" Garbage-Collection-Algorithmus neu geschrieben werden.
Das Problem ist aber tiefergehend. Eigentlich müssten alle Datenstrukturen, die Python intern nutzt, thread-sicher sein. Am einfachsten wäre dies gegeben, indem man persistente, unveränderliche Datenstrukturen nutzt, wie sie Clojure populär gemacht hat. Leider basiert Python aber in seiner Grundfeste auf veränderbaren dictionaries, eigentlich einem Implementationsdetail, welches aber durch Eigenschaften wie die __dict__-Attribute Teil der Sprachsemantik geworden ist.
Ich denke daher, dass man den GIL nur dann effektiv loswerden könnte, wenn man quasi eine neue Sprache schafft, die auf den ersten Blick zwar die Syntax mit Python teilt, aber ihr inneres Verhalten nicht mehr kompatibel zu Python ist. Das fängt damit an, dass man sich nicht mehr darauf verlassen darf, dass Objekte zeitig gelöscht und dabei z.B. offene Betriebssystem-Ressourcen wie Dateien geschlossen werden und muss damit enden, dass Exemplare von Klasen nicht mehr beliebige Attribute haben können. So würde ich fordern, dass man jedes Attribut in der Klasse deklarieren muss, was dann dazu führt, dass man keine dynamischen Dictionaries mehr braucht, um Speicherplatz für die Attributwerte zu schaffen. Da Klassen Exemplare von Metaklassen sind, gilt das selbe für Methoden. Um die Flexibilität zu erhalten, nachträglich noch Methoden (oder Attribute) zu ergänzen, würde ich vorschlagen, eine Syntax zu schaffen, die klar macht, dass dies eine aufwendige Operation ist. Self zeigt, wie man das technisch löst, darauf will ich hier gar nicht eingehen.
Man verliert dadurch zwar Flexibilität in der Meta-Programmierung, aber 80% aller Anwender werden das wahrscheinlich gar nicht merken. Man würde im Gegenzug effizientes Multithreading gewinnen. Denn eigentlich finde ich die Ideen von Clojure (oder auch Erlang) genau richtig, doch eine etwas einfachere Syntax (zu dem Preis im Vergleich bei Clojure, die Homoikonizität - oder wie das heißen mag - also die Selbstreflexivität - zu verlieren, den ich aber gerne zahlen würde).
Stefan
Interessant finde ich die Erkenntnis, dass fast vollständig das Reference Counting (das gegen racing conditions bei mehreren Threads gesichert werden muss)für die Verlangsamung verantwortlich ist. Würde man dieses ausbauen, wäre viel gewonnen. Leider würden dann die meisten C-Extensions nicht mehr funktionieren. Sie müssten alle im Hinblick auf einen "richtigen" Garbage-Collection-Algorithmus neu geschrieben werden.
Das Problem ist aber tiefergehend. Eigentlich müssten alle Datenstrukturen, die Python intern nutzt, thread-sicher sein. Am einfachsten wäre dies gegeben, indem man persistente, unveränderliche Datenstrukturen nutzt, wie sie Clojure populär gemacht hat. Leider basiert Python aber in seiner Grundfeste auf veränderbaren dictionaries, eigentlich einem Implementationsdetail, welches aber durch Eigenschaften wie die __dict__-Attribute Teil der Sprachsemantik geworden ist.
Ich denke daher, dass man den GIL nur dann effektiv loswerden könnte, wenn man quasi eine neue Sprache schafft, die auf den ersten Blick zwar die Syntax mit Python teilt, aber ihr inneres Verhalten nicht mehr kompatibel zu Python ist. Das fängt damit an, dass man sich nicht mehr darauf verlassen darf, dass Objekte zeitig gelöscht und dabei z.B. offene Betriebssystem-Ressourcen wie Dateien geschlossen werden und muss damit enden, dass Exemplare von Klasen nicht mehr beliebige Attribute haben können. So würde ich fordern, dass man jedes Attribut in der Klasse deklarieren muss, was dann dazu führt, dass man keine dynamischen Dictionaries mehr braucht, um Speicherplatz für die Attributwerte zu schaffen. Da Klassen Exemplare von Metaklassen sind, gilt das selbe für Methoden. Um die Flexibilität zu erhalten, nachträglich noch Methoden (oder Attribute) zu ergänzen, würde ich vorschlagen, eine Syntax zu schaffen, die klar macht, dass dies eine aufwendige Operation ist. Self zeigt, wie man das technisch löst, darauf will ich hier gar nicht eingehen.
Man verliert dadurch zwar Flexibilität in der Meta-Programmierung, aber 80% aller Anwender werden das wahrscheinlich gar nicht merken. Man würde im Gegenzug effizientes Multithreading gewinnen. Denn eigentlich finde ich die Ideen von Clojure (oder auch Erlang) genau richtig, doch eine etwas einfachere Syntax (zu dem Preis im Vergleich bei Clojure, die Homoikonizität - oder wie das heißen mag - also die Selbstreflexivität - zu verlieren, den ich aber gerne zahlen würde).
Stefan