Frage zu Python Threads

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Wie ist das bitte mit Python Threads. Kommt es zu einem Threadwechsel nur nach Ausführung vollständiger Python Befehle oder auch mittendrin?
Wenn ich etwa von einer anderen Task aus einen append mache, bevor in der Maintask ein pop kommt, ist kein Problem.
Wenn ich von einer anderen Task aus einen append mache, nachdem in der Maintask ein pop ausgeführt wurde, ist auch kein Problem.
Aber wenn ich einen append mache, während eines pops, das dürfte ein Problem sein, sofern man da nicht lockt. Also ist da ein lock erforderlich?

Oder anders ausgedrückt: laufen die Threadwechsel Pythongesteuert ab oder auf Prozessorebene?
BlackJack

@Alfons Mittelmeyer: Finde dazu irgendwelche zugesagten Garantien in der Python-Dokumentation. Solltest Du keine finden, musst Du davon ausgehen das Du sperren musst um threadsicher zu sein. Es werden echte Threads verwendet wenn die Möglichkeit auf dem System vorhanden ist. CPython ist wegen des „global interpreter lock“ (GIL) threadsicherer als von der Sprachspezifikation zugesichert wird, aber gerade dieses GIL ist etwas was ganz oben auf der Wunschliste von vielen Python-Programmierern steht wenn es darum geht was man an CPython ändern sollte. Wenn das jemand in Angriff nimmt das zu entfernen und es schafft das ohne nennenswerten Leistungsverlust für „single threaded“-Programme zu implementieren, dann ist auch bei CPython nicht mehr so viel sicher wie jetzt halt durch ”Zufall”.

Ausserdem was heisst ”vollständige Pythonbefehle”? `append()` und `pop()` sind erst einmal einfach Methoden auf einem Objekt. Und die bestehen ja selber wieder aus Code der aus mehreren Schritten besteht. Ob das jetzt auf Ebene der Bytecode-VM jeweils ein atomarer Bytecode-Befehl ist, oder mehr als einer, ist ein Implementierungsdetail was sich selbst bei CPython bei jeder neuen Minor-Version ändern kann. Der Bytecode ist nicht fest vorgegeben wie beispielsweise bei der JVM wo das zur Sprachspezifikation gehört. In Python kann sich der Bytecode jederzeit ändern, das heisst eine ``*.pyc``-Datei passt nur zu dem Python x.y.*-Interpreter der sie erzeugt hat. Und eine Python-Implementierung muss auch gar keinen Bytecode erzeugen oder von anderen lesen können. Das ist eine reine Optimierungsmassnahme die optional ist.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack Danke, habe ich mir schon gedacht, besser auf Nummer sicher gehen, sofern kein atomarer Befehlssatz und Garantien dazu vorhanden sind.

Naja, genau so ist es von Python her richtig implementiert. Man könnte zwar auch so etwas implementieren, dass aus Python Quellcode eine Sequenz in C ausführbarer Objekte erzeugt wird, und die virtuelle Maschine nur nach solchen ausführbaren Objekten umschaltet. Aber das wäre doch sehr ungeschickt. Denn wenn solch ein Objekt etwa Fileschreiben wäre und das würde länger dauern, käme der andere Thread dann in der Zwischenzeit nicht dran.

Also genau richtig so.
Antworten