Frage

Ich schrieb ein schönes multithreaded Skript, und wenn ich es laufe, es schlechter ab mit 25 Fäden als mit nur direktem Aufruf der Thread-Handler.

Dann entdeckte ich die globale Interpreter Lock. Ich möchte fragen, bevor ich für dieses Skript Python verwerfen und neu schreiben, das Ding in etwas anderes, ist es eine Möglichkeit in Python Multithreading tatsächliche Arbeitszeit zu tun?

War es hilfreich?

Lösung

Der andere Ansatz ist Fäden zu verzichten und stattdessen den Multi Modul (Python 2.6 +) erhält, die den GIL rund und hat eine API, das das zumindest ähnlich den in dem Einfädeln Modul.

Andere Tipps

Nun ist dies eine interessante Frage. - Ich glaube nicht, dass es eine ist die GIL in gerade CPython Flucht

Stackless Python sollte verbessert haben "Parallelität" Leistung über CPython mit dem Einsatz von Microthreads , aber ich denke, es ist dont't die GIL entkommt.

Zusätzlich wird gemäß der GIL Seite auf python.org , Jython und Ironpython nicht haben eine GIL.

Die richtige Antwort hängt stark ab, was Sie tun.

Stark CPU-gebundene (und Blockierung IO-gebunden) Aufgaben, wie Kompression und Bildwiedergabe, wird in der Regel mit nativen Code getan, und native Bibliotheken normalerweise den GIL freigeben, während sie arbeiten, die Gleichzeitigkeit ermöglicht. Wenn Sie die CPU-intensive Arbeit zu einem engen nativen Aufruf isolieren können Sie Gleichzeitigkeit, native Performance bekommen, wo es zählt, und die Bequemlichkeit des Großteil des Codes in Python geschrieben werden.

Nicht alle Code haben diese kleinen, isolierbar Blöcke von Computercode, der fein säuberlich in einer nativen Bibliothek implementiert werden kann, aber eine ganze Menge tun.

In CPython (die Implementierung von Python in C), nein, nach meinem Wissen. (Wenn ich falsch bin, bitte korrigieren Sie mich, ich würde sicher gerne wissen, ob es eine Lösung gibt!).

Sie möchten vielleicht in Ironpython (.NET) oder JPython (Java / JWM) interessiert. Ich habe sie nicht benutzt, aber ich glaube, zumindest einer von ihnen Fäden stammen aus der gegebenen Ausführungsumgebung unterstützt.

Sie könnten versuchen, das Multiprozessing Modul, wenn es um Ihr Problem anwendbar ist.

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