2010-02-18 16 views
16

Digamos que estoy usando un controlador signal para manejar un temporizador de intervalo.es la asignación de la variable python atómica?

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

¿Puedo establecer SomeGlobalVariable sin preocuparse de que, en un escenario poco probable que, si bien el establecimiento SomeGlobalVariable (es decir, la máquina virtual de Python se ejecuta el código de bytes para establecer la variable), que la asignación dentro del manejador de la señal va a romper algo? (Es decir meta-estable estado)

actualización: Estoy interesado específicamente en el caso donde se realiza una "asignación de compuesto" fuera del manipulador.

(tal vez estoy pensando demasiado "bajo nivel" y todo esto es atendido en Python ... con una formación en sistemas integrados, tengo este tipo de impulsos de vez en cuando)

Respuesta

12

Asignación sencilla a variables simples es "atómico" AKA threadsafe (asignaciones compuestas como += o asignaciones a elementos o atributos de objetos no necesitan serlo, pero su ejemplo es una asignación simple a una variable simple, aunque global, por lo tanto segura).

+0

pero ¿qué pasa con la "asignación compuesta" fuera del controlador? – jldupont

+1

Si el manejador (por ej.) 'Gvar = 3',' gvar' es inicialmente 7, y el código fuera del manejador (ej.) 'Gvar + = 2', entonces' gvar' podría terminar como 3, 5, o 9, dependiendo de cómo las operaciones terminan intercaladas. Eso es técnicamente "seguro" (es decir, el proceso no se bloqueará ;-) pero es poco probable que esté semánticamente bien. –

+2

¿Dónde se especifica? -1 por falta de referencia autorizada. – rightfold

1

La asignación compuesta implica tres pasos: leer-actualizar-escribir. Esta es una condición de carrera si se ejecuta otro subproceso y escribe un nuevo valor en la ubicación después de que se realiza la lectura, pero antes de la escritura. En este caso, un valor obsoleto se está actualizando y escribiendo, lo que arruinará cualquier valor nuevo que haya escrito el otro subproceso. En Python, cualquier cosa que implique la ejecución de un único código de bytes DEBERÍA ser atómica, pero la asignación compuesta no se ajusta a este criterio. Usa un candado

+0

En la situación que se muestra arriba, solo tengo un hilo de ejecución. Además, no es como si pudiera "retrasar" la ejecución del manejador de señal. Por supuesto, puedo recurrir a una cola segura para subprocesos si la opinión de la confianza del cerebro de SO lo prescribe. – jldupont

+0

Si tiene un único hilo, ¿dónde se ejecuta el controlador? Si está en el mismo hilo, entonces nada puede alterar el estado mientras se está ejecutando en primer lugar. –

+0

@ Max S.: ¿estás seguro? Mira la respuesta de @Alex Martelli. – jldupont

Cuestiones relacionadas