[pyar] threading.local..

Tordek kedrot en gmail.com
Mie Jul 13 14:45:25 ART 2011


On 13/07/11 14:13, david weil wrote:
> Es esto un bug?
No.

pydoc _threading_local

Supongo que lo que pensabas era que cuando creas un threading.local 
te devuelve el mismo local cuando estás en el mismo thread. No es 
así. Cuando accedés a una propiedad de un local, te devuelve el 
mismo valor si estás en un mismo thread. Si creás otro local, está 
vacío.

> Si no es un bug, no entiendo como debería funcionar o para que se usa...

Con el ejemplo de pydoc:

       >>> mydata = local()
       >>> mydata.number = 42
       >>> mydata.__dict__
       {'number': 42}
       >>> mydata.__dict__.setdefault('widgets', [])
       []
       >>> mydata.widgets
       []
       >>> log = []
       >>> def f():
       ...     items = mydata.__dict__.items()
       ...     items.sort()
       ...     log.append(items)
       ...     mydata.number = 11
       ...     log.append(mydata.number)

       >>> import threading
       >>> thread = threading.Thread(target=f)
       >>> thread.start()
       >>> thread.join()
       >>> log
       [[], 11]
       >>> mydata.number
       42
       >>> mydata.widgets
       []

Creás mydata, que es un local para cada thread, y le asignás valores.

En el thread principal, mydata.number == 42, y mydata.widgets == [].

Después tenés la función f, que asigna valores a mydata. Hacés que 
se ejecute en su propio thread. Podés ver que funciona correctamente 
porque log (que es global) da los valores correctos.

Ahora, cuando accedés a los valores de mydata, ves que sigue 
teniendo los valores originales. Esto es porque ahora estás de 
vuelta en el thread principal, y esos valores pertenecen al thread 
principal.

...

Con respecto a "para qué se usa"... es para cuando tenés una 
variable global que se asigna en otro lado, y otro thread la puede 
pisotear y sobreescribirla... pero casi todos los casos que se me 
ocurren se pueden solucionar en Python mediante "no uses globales, y 
devolvé múltiples valores mediante tuplas".

>
> saludosss..
> dave
>
> ps: python 2.7.1.4.. activestate..


-- 
Guillermo O. «Tordek» Freschi. Programador, Escritor, Genio Maligno.
http://tordek.com.ar :: http://twitter.com/tordek
http://www.arcanopedia.com.ar - Juegos de Rol en Argentina



More information about the pyar mailing list