Frage

Hat jemand weiß Schicksal Global Interpreter Lock in Python 3.1 gegen C ++ Multithreading Integration

War es hilfreich?

Lösung

GIL ist immer noch da in CPython 3.1; die unb Ziele (unter vielen anderen Leistungssteigerungen) Projekte entfernen schließlich, aber es ist immer noch eine Möglichkeit, von ihren Zielen und arbeitet an 2,6 zuerst mit der Absicht, schließlich Portierung für auf 3.x, was auch immer x die 2.Y Version betrachtet erfolgte Strom wird durch die Zeit werden. Vorerst Multiprozessing (statt Threading) bleibt die Art und Weise der Wahl für die Verwendung mehrerer Kerne in CPython (Ironpython und Jython sind zu fein, aber sie unterstützen Python 3 nicht zur Zeit, noch haben sie C ++ Integration machen so einfach entweder; - ).

Andere Tipps

Wesentliche Änderungen werden in der GIL für Python 3.2 auftreten. Werfen Sie einen Blick auf die Was für Python Neue 3.2 , und der Faden, der es in der Mailing-Liste eingeleitet.

Während die Veränderungen bedeuten nicht das Ende der GIL, sie Herold potenziell enorme Leistungssteigerungen.

UPDATE0

  • Die allgemeinen Leistungssteigerung mit dem neuen GIL in 3,2 von Antoine Pitrou waren vernachlässigbar, und konzentrierte sich stattdessen auf Konkurrenzprobleme zu verbessern , die in bestimmten Fällen Ecke entstehen.
  • Eine bewundernswerte Anstrengung von David Beazley wurde einen Scheduler zu implementieren, um die Leistung erheblich zu verbessern, wenn CPU und IO gebundene Fäden gemischt werden, die leider abgeschossen wurden.
  • Die unb Arbeit war für die Zusammenführung in Python vorgeschlagen 3.3, aber dies wurde wegen Mangel an Ergebnissen in diesem Projekt zurückgezogen. PyPy ist nun das bevorzugte Projekt und ist zur Zeit Finanzierung anfordernden Python3k Unterstützung hinzuzufügen. Es gibt kaum eine Chance, dass PyPy der Standard derzeit werden wird.

Die Bemühungen haben in den letzten 15 Jahren gemacht worden, um die GIL von CPython zu entfernen, aber für die absehbare Zukunft ist es, hier zu bleiben.

Die GIL wird nicht Ihren Code beeinflussen, die nicht Python Objekte nicht verwendet. In Numpy, lassen wir die GIL für Rechencode (lineare Algebra Anrufe, etc ...), und der zugrunde liegende Code Multithreading frei verwenden kann (in der Tat, die allgemein 3rd-Party-Bibliotheken sind, die nichts über Python wissen)

Die GIL ist eine gute Sache.

So stellen Sie Ihre C ++ Anwendung die GIL freizugeben, während es seine multithreaded Arbeit tut. Python-Code wird auch in den anderen Threads ausgeführt werden, unberührt. Nur die GIL erwerben, wenn Sie Python-Objekte zu berühren haben.

Ich denke, es wird immer ein GIL sein. Der Grund ist die Leistung. alle Zugang auf niedriger Ebene Thread-sicher zu machen - bedeutet einen Mutex um jeden Hash-Operation setzen usw. ist schwer. Denken Sie daran, dass eine einfache Anweisung wie

self.foo(self.bar, 3, val)

Könnte schon mindestens 3 haben hashtable Lookups zur Zeit (falls val ein global ist) und vielleicht sogar viel mehr, wenn die Methode Cache nicht heiß ist (abhängig von der Vererbungstiefe der Klasse)

Es ist teuer - das ist, warum Java die Idee fallen gelassen und eingeführt Hash-Tabellen, die von nicht zu bekommen, einen Monitor-Aufruf zu befreien seine „Java ist langsam“ Marke

.

Wie ich es verstehe der "Gehirnfick" Scheduler wird die GIL von Python 3.2

ersetzen

BFS bainfuck Scheduler

Wenn der GIL in die Quere, benutzen Sie einfach die Modul Multiprozessing . Er laicht neue Prozesse, sondern nutzt das Threading-Modell und (die meisten der) api. Mit anderen Worten, können Sie prozessbasierte Parallelität in einer fadenartigen Art und Weise tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top