2010-02-18 5 views
16

Nehmen wir an, ich verwende einen signal Handler für die Behandlung eines Intervall-Timers.ist Python-Variablen-Zuweisung atomar?

def _aHandler(signum, _): 
    global SomeGlobalVariable 
    SomeGlobalVariable=True 

Kann ich SomeGlobalVariable ohne dass ich Gedanken, in einem unwahrscheinlichen Szenario, dass SomeGlobalVariable während Einstellung (das heißt der Python VM-Bytecode wurde die Ausführung der Variablen zu setzen), dass die Zuordnung innerhalb der Signal-Handler etwas brechen? (D metastabilen Zustand)

aktualisieren: Ich bin interessiert speziell in dem Fall, in dem ein „compound Assignment“ außerhalb des Handlers vorgenommen.

(vielleicht auch „low level“ Ich denke und das alles kümmert in Python genommen wird ... kommt von einem Embedded System Hintergrund, habe ich diese Art von Impulsen von Zeit zu Zeit)

Antwort

12

Einfache Zuordnung zu einfachen Variablen ist "atomare" AKA threadsafe (zusammengesetzte Zuordnungen wie += oder Zuordnungen zu Elementen oder Attributen von Objekten müssen nicht sein, aber Ihr Beispiel ist eine einfache Zuordnung zu einer einfachen, wenn auch globalen Variable, also sicher).

+0

aber was ist mit "Compound Assignment" außerhalb des Handlers? – jldupont

+1

Wenn der Handler (zB) 'gvar = 3',' gvar' anfänglich 7 ist und der Code außerhalb des Handlers (zB) 'gvar + = 2', dann könnte' gvar' entweder 3 sein, 5, oder 9, abhängig davon, wie die Operationen verschachtelt enden. Das ist technisch "sicher" (was bedeutet, dass der Prozess nicht abstürzt ;-), aber wahrscheinlich nicht semantisch in Ordnung ist. –

+2

Wo ist das angegeben? -1 wegen fehlender autoritativer Referenz. – rightfold

1

Die Verbindungszuordnung umfasst drei Schritte: Lesen-Aktualisieren-Schreiben. Dies ist eine Race-Bedingung, wenn ein anderer Thread ausgeführt wird und nach dem Lesen, aber vor dem Schreiben einen neuen Wert in den Speicherort schreibt. In diesem Fall wird ein veralteter Wert aktualisiert und zurückgeschrieben, wodurch der neue Wert, der von dem anderen Thread geschrieben wurde, nicht mehr berücksichtigt wird. In Python sollte alles, was die Ausführung eines einzelnen Byte-Codes beinhaltet, atomar sein, aber die zusammengesetzte Zuweisung entspricht nicht diesem Kriterium. Verwenden Sie ein Schloss.

+0

In der oben dargestellten Situation habe ich nur einen einzigen Thread der Ausführung. Außerdem kann ich die Ausführung des Signal-Handlers nicht "verzögern". Natürlich kann ich auf eine Thread-sichere Warteschlange zurückgreifen, wenn die Meinung des Brain Trust von SO dies vorschreibt. – jldupont

+0

Wenn Sie einen einzelnen Thread haben, wo wird der Handler ausgeführt? Wenn es sich um den gleichen Thread handelt, kann nichts den Zustand ändern, während es überhaupt ausgeführt wird. –

+0

@Max S.: Bist du sicher? Schau dir @Alex Martellis Antwort an. – jldupont