Versteckte Multithreading-Engpässe in Jython?

Was sind einige verborgene Dinge, die in Jython Multithreading / Parallelität verpassen können? Ich habe einige Parallel-Code (mit Python's Threading-Bibliothek), die nicht über 3-4 CPUs skalieren, und ich bin sicher, es ist nicht wegen einer dieser offensichtlichen Fallstricke:

Grundsätzlich ist alle Algorithmen ein Bündel von String Verarbeitung, Liste und Wörterbuch Lookups und Mathematik. Mein Verständnis ist, dass, im Gegensatz zu CPython, Jython keine GIL hat.

3 Solutions collect form web for “Versteckte Multithreading-Engpässe in Jython?”

Der Zugriff auf Variablen ist eines dieser "versteckten" Engpässe. Wenn alle Threads auf einige gemeinsam genutzte Datenstrukturen zugreifen, wird es eine Synchronisation zwischen den Threads geben.

Jython versucht hart, Sprachkompatibilität mit CPython zu erreichen. Eine Sache, die die GIL sicherstellt, ist, dass der Zugriff auf lokale / globale Variablen, Objektmitglieder, Dict-Elemente (technisch Einheimische, Globale und Objektmitglieder auch Dict-Elemente sind) oder sogar Listenelemente sind atomar. Um Überraschungen für Benutzer zu vermeiden, verwendet Jython eine gleichzeitige Hash-Map, um Dicts zu implementieren. Dies bedeutet, dass es einige Synchronisation geht, wenn auf jede Art von Dict-Elemente in Jython zugreifen. Diese sycnhronisation ist gestreift, um den Zugriff auf das Dict von mehreren Threads zu unterstützen, ohne sie zu blockieren, aber wenn mehrere Threads auf dieselbe Variable zugreifen, werden sie die gleiche Sperre treffen.

Der beste Weg, um Skalierbarkeit in Jython zu erreichen, und jede andere Sprache ist, um sicherzustellen, dass die Daten, die Sie in jedem Thread zugreifen, auch nicht von anderen Threads zugegriffen wird.

Jython hat keine GIL, aber es ist ziemlich hart, viel Parallelität zu bekommen. Wenn du irgendwelche Teile hast, die nicht parallel geschehen können, wirst du von Ahmdahls Gesetz gebissen:

Die Beschleunigung eines Programms, das mehrere Prozessoren im Parallelrechnen verwendet, ist durch die Zeit begrenzt, die für den sequentiellen Bruch des Programms benötigt wird.

Außerdem, auch wenn du rein parallele Berechnungen machst, wirst du von anderen Dingen gebissen, wie deinen Cache anstrengen. Denken Sie auch daran, dass Ihr Code auf einer virtuellen Maschine läuft, also auch wenn Ihr Code rein parallel ist, könnte die JVM eine interne Koordination haben, die Sie zurückhält (Garbage Collection ist ein offensichtlicher Kandidat).

Haben Sie irgendwelche Performance-Analyse- Pakete versucht? Auch wenn sie nicht explizit für Jython wette ich wette, dass es etwas helfen würde.

Ich würde zuerst versuchen, wenn du Zugang zu einer Lizenz hast.

  • Verdreht: Unterschied zwischen `defer.execute` und` threads.deferToThread`
  • "Kann nicht einen neuen Thread-Fehler" in Python starten
  • Update GUI zu verschiedenen Zeitintervallen in QT
  • Python TCP Server akzeptiert Verbindungen und Broadcasting Befehle
  • Wie kann ich omxplayer (Python / Himbeer-Pi) öffnen und schließen?
  • Multi-Threading in Selen-Python
  • Threading / Queue in Python
  • Brauchen Sie Hilfe mit Python Threading / Warteschlange
  • Txt-Datei mit Multi-Threaded in Python lesen
  • Python-Code-Performance verringert sich mit Threading
  • Multithreaded Python urllib2-basierte Downloader fährt den Computer auf Standby / Sleep
  • Python ist die beste Programmiersprache der Welt.