2010-02-18 20 views
16

Załóżmy, że używam programu obsługi signal do obsługi interwalometru.jest przypisanie zmiennej Pythona atomowej?

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

mogę ustawić SomeGlobalVariable bez obawy, że w mało prawdopodobnym scenariuszu, że podczas ustawiania SomeGlobalVariable (czyli Python VM został wykonującego kodu bajtowego ustawić zmienną), że przypisanie w ramach obsługi sygnału pęknie coś? (Tj metastabilna stan)

Aktualizacja: Istnieje szczególnie zainteresowany w przypadku, gdy „przypisanie związek” jest wykonany na zewnątrz uchwytu.

(może myślę zbyt „niski poziom”, a to wszystko jest załatwione w Pythonie ... pochodzące z Embedded Systems tle, mam tego rodzaju impulsów od czasu do czasu)

Odpowiedz

12

Proste przypisania do prostych zmiennych jest "atomowa" AKAafeafe (przypisania złożone, takie jak += lub przypisania do elementów lub atrybutów obiektów nie muszą być, ale twój przykład jest prostym przydziałem do prostej, aczkolwiek globalnej, zmiennej, a więc bezpiecznej).

+0

ale co z "przypisaniem złożonym" poza obsługą? – jldupont

+1

Jeśli handler ma (np.) 'Gvar = 3',' gvar' ma początkowo 7, a kod spoza programu obsługi (np.) 'Gvar + = 2', wtedy' gvar' może skończyć jako 3, 5 lub 9, w zależności od tego, w jaki sposób operacje zostaną przeplatane. Jest to technicznie "bezpieczne" (co oznacza, że ​​proces się nie zawiesza ;-), ale mało prawdopodobne, aby był semantycznie w porządku. –

+2

Gdzie to określono? -1 z powodu braku autorytatywnego odniesienia. – rightfold

1

Przypisanie złożone obejmuje trzy etapy: odczyt-aktualizacja-zapis. Jest to warunek wyścigowy, jeśli kolejny wątek jest uruchamiany i zapisuje nową wartość do lokalizacji po tym, jak nastąpi odczyt, ale przed zapisaniem. W tym przypadku aktualizowana jest i odświeżana wartość, co spowoduje oderwanie się od nowej wartości zapisanej przez drugi wątek. W Pythonie wszystko, co wymaga wykonania kodu bajtowego, powinno być atomowe, ale przypisanie złożone nie pasuje do tych kryteriów. Użyj blokady.

+0

W przedstawionej powyżej sytuacji mam tylko jeden wątek wykonania. Co więcej, nie jest tak, że mogę "opóźnić" wykonanie obsługi sygnału. Oczywiście mogę odwołać się do kolejki wątkowo bezpiecznej, jeśli taka jest opinia o zaufaniu TU przez mózg. – jldupont

+0

Jeśli masz pojedynczy wątek, gdzie działa przewodnik? Jeśli jest w tym samym wątku, nic nie może zmienić stanu, kiedy działa. –

+0

@Max S.: na pewno? Spójrz na odpowiedź @Alex Martelli. – jldupont

Powiązane problemy