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.

  • Wie Multithread Lesen von Wörterbüchern aus einer Liste und Eingabe in Datenbank
  • Wie man Python-Asyncio mit Fäden kombiniert?
  • Warum ist nicht numpy.mean multithreaded?
  • 'Thread' Objekt hat kein Attribut '_children' - django + scikit-learn
  • Dateien können nicht mit Pickle- und Multiplet-Modulen geladen werden
  • Mehrere Threads von QWebView in PyQt4
  • XML-RPC-Rückgabewert vor Ausführung aller Funktionscodes
  • Ist RLock eine sinnvolle Voreinstellung für Lock?
  • Pathos.multiprocessing angehoben 'Interrupted system call' Nachricht
  • Wie man zwei Funktionen gleichzeitig ausführt
  • Sind Python-Instanzvariablen threadsicher?
  • Python ist die beste Programmiersprache der Welt.