Frage

Ein zuverlässiger Programmiererfreund erzählte mir, dass die aktuelle Multithreading-Implementierung von Python ernsthaft fehlerhaft sei – genug, um sie ganz zu vermeiden.Was kann man zu diesem Gerücht sagen?

War es hilfreich?

Lösung

Python-Threads sind gut dafür gleichzeitige I/O-Programmierung.Threads werden aus der CPU ausgelagert, sobald sie das Warten auf Eingaben aus Datei, Netzwerk usw. blockieren.Dadurch können andere Python-Threads die CPU nutzen, während andere warten.Dies würde es Ihnen beispielsweise ermöglichen, einen Multithread-Webserver oder Webcrawler zu schreiben.

Python-Threads werden jedoch von der serialisiert GIL wenn sie in den Dolmetscherkern eintreten.Das bedeutet, dass, wenn zwei Threads Zahlen verarbeiten, jeweils nur einer ausgeführt werden kann.Dies bedeutet auch, dass Sie die Vorteile von Multi-Core- oder Multi-Prozessor-Architekturen nicht nutzen können.

Es gibt Lösungen wie die gleichzeitige Ausführung mehrerer Python-Interpreter mithilfe einer C-basierten Threading-Bibliothek.Dies ist nichts für schwache Nerven und die Vorteile sind die Mühe möglicherweise nicht wert.Hoffen wir auf eine reine Python-Lösung in einer zukünftigen Version.

Andere Tipps

Die Standardimplementierung von Python (allgemein bekannt als CPython, da es in C geschrieben ist) verwendet Betriebssystem-Threads, aber seitdem gibt es die Globale Dolmetschersperre, darf jeweils nur ein Thread Python-Code ausführen.Aber innerhalb dieser Einschränkungen sind die Threading-Bibliotheken robust und weit verbreitet.

Wenn Sie mehrere CPU-Kerne nutzen möchten, gibt es einige Möglichkeiten.Eine davon besteht darin, mehrere Python-Interpreter gleichzeitig zu verwenden, wie von anderen erwähnt.Eine andere Möglichkeit besteht darin, eine andere Implementierung von Python zu verwenden, die keine GIL verwendet.Die beiden Hauptoptionen sind Jython Und IronPython.

Jython ist in Java geschrieben und mittlerweile ziemlich ausgereift, obwohl einige Inkompatibilitäten bestehen bleiben.Zum Beispiel das Webframework Django läuft noch nicht perfekt, kommt aber immer näher.Jython ist ideal für Thread-Sicherheit, kommt heraus besser in Benchmarks und hat eine freche Nachricht für diejenigen, die die GIL wollen.

IronPython verwendet das .NET Framework und ist in C# geschrieben.Die Kompatibilität erreicht das Stadium, in dem Django kann auf IronPython ausgeführt werden (zumindest als Demo) und es gibt Anleitungen zur Verwendung von Threads in IronPython.

Die GIL (Global Interpreter Lock) könnte ein Problem sein, aber die API ist ganz in Ordnung.Probieren Sie das Exzellente aus processing Modul, das die Threading-API für separate Prozesse implementiert.Ich verwende das gerade (allerdings unter OS X, habe aber noch einige Tests unter Windows durchgeführt) und bin wirklich beeindruckt.Die Queue-Klasse spart mir wirklich viel Geld, wenn es um die Verwaltung der Komplexität geht!

BEARBEITEN:Es scheint, dass das Verarbeitungsmodul ab Version 2.6 in die Standardbibliothek aufgenommen wird (import multiprocessing).Freude!

Soweit ich weiß, gibt es keine wirklichen Fehler, aber die Leistung beim Threading in cPython ist wirklich schlecht (im Vergleich zu den meisten anderen Threading-Implementierungen, aber normalerweise gut genug, wenn die meisten Threads nur blockieren). GIL (Global Interpreter Lock), es handelt sich also eher um eine Implementierungs- als um eine Sprachspezifische Sperre.Davon leidet beispielsweise Jython aufgrund der Verwendung des Java-Thread-Modells nicht.

Sehen Das Beitrag darüber, warum es nicht wirklich möglich ist, die GIL aus der cPython-Implementierung zu entfernen, und Das für einige praktische Ausarbeitungen und Problemumgehungen.

Googeln Sie schnell nach „Python-GIL“ für mehr Informationen.

Wenn Sie in Python programmieren und großartige Threading-Unterstützung erhalten möchten, sollten Sie sich IronPython oder Jython ansehen.Da der Python-Code in IronPython und Jython auf der .NET CLR bzw. Java VM läuft, profitieren sie von der großartigen Threading-Unterstützung, die in diese Bibliotheken integriert ist.Darüber hinaus verfügt IronPython nicht über die GIL, ein Problem, das CPython-Threads daran hindert, die Vorteile von Multi-Core-Architekturen voll auszuschöpfen.

Ich habe es in mehreren Anwendungen eingesetzt und habe noch nie davon gehört oder gehört, dass Threading etwas anderes als 100 % zuverlässig ist, solange man seine Grenzen kennt.Sie können nicht 1.000 Threads gleichzeitig erzeugen und erwarten, dass Ihr Programm unter Windows ordnungsgemäß ausgeführt wird. Sie können jedoch problemlos einen Worker-Pool schreiben und ihn einfach mit 1.000 Vorgängen versorgen und alles unter Kontrolle halten.

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