En una función:
a += 1
será interpretado por el compilador como assign to a => Create local variable a
, que no es lo que desea. Probablemente fallará con un a not initialized
error ya que el (local) a de hecho no se ha inicializado:
>>> a = 1
>>> def f():
... a += 1
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UnboundLocalError: local variable 'a' referenced before assignment
Puede obtener lo que desea con la global
palabra clave (muy mal vista y por buenas razones) , así:
>>> def f():
... global a
... a += 1
...
>>> a
1
>>> f()
>>> a
2
Sin embargo, en general, debe evitar el uso de variables globales que se salen de control con mucha rapidez. Y esto es especialmente cierto para los programas multiproceso, donde no tiene ningún mecanismo de sincronización para thread1
saber cuándo a
se ha modificado. En resumen: los hilos son complicados y no puede esperar tener una comprensión intuitiva del orden en el que ocurren los eventos cuando dos (o más) subprocesos funcionan con el mismo valor. El lenguaje, compilador, SO, procesador ... TODOS pueden jugar un papel, y decidir modificar el orden de las operaciones por velocidad, practicidad o cualquier otra razón.
La forma correcta para este tipo de cosas es usar las herramientas de intercambio de Python ( bloqueos
y amigos), o mejor, comunicar datos a través de una cola en lugar de compartirlos, por ejemplo, así:
from threading import Thread
from queue import Queue
import time
def thread1(threadname, q):
while True:
a = q.get()
if a is None: return
print a
def thread2(threadname, q):
a = 0
for _ in xrange(10):
a += 1
q.put(a)
time.sleep(1)
q.put(None)
queue = Queue()
thread1 = Thread( target=thread1, args=("Thread-1", queue) )
thread2 = Thread( target=thread2, args=("Thread-2", queue) )
thread1.start()
thread2.start()
thread1.join()
thread2.join()