2012-04-28 39 views
6
globalnum = 0 
n = 1 

class T(threading.Thread): 
    def run(self): 
    global globalnum 
    globalnum += n 

for _ in xrange(0, 999): 
    t = T() 
    t.start() 

print globalnum 

el resultado es 999 En mi prueba me parece + = thread safe Mi pregunta es: is + = really thread safe?es + = en el hilo de python seguro?

+0

¿Cree que dos de sus hilos en realidad estaban funcionando al mismo tiempo? – stark

+0

Tratando de determinar hilo de seguridad por medio de una prueba es una señal de ignorancia o locura. El punto sobre las cosas que son _No_ flujos seguros es que no se puede confiar en un comportamiento en particular sólo porque se han visto unos cuantos millones de veces sin desviación. –

Respuesta

18

No, no es seguro para subprocesos como la operación x += 1 tarda de 4 códigos de operación que se muestra a continuación:

4   0 LOAD_GLOBAL    0 (x) 
       3 LOAD_CONST    1 (1) 
       6 INPLACE_ADD   
       7 STORE_GLOBAL    0 (x) 

seleccionado de:

>>> import dis 
>>> def test(): 
...  global x 
...  x += 1 
...  
... 
>>> dis.disassemble(test.func_code) 
    4   0 LOAD_GLOBAL    0 (x) 
       3 LOAD_CONST    1 (1) 
       6 INPLACE_ADD   
       7 STORE_GLOBAL    0 (x) 
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE   
+3

+1 para mostrar cómo desmontar! ¡Buen truco! :) – johndodo

Cuestiones relacionadas