-
-
Save zjyExcelsior/482d290e7b62c904cdf8f545c2e119e2 to your computer and use it in GitHub Desktop.
documentation on _threading_local
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Help on module _threading_local: | |
NAME | |
_threading_local - Thread-local objects. | |
FILE | |
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_threading_local.py | |
MODULE DOCS | |
http://docs.python.org/library/_threading_local | |
DESCRIPTION | |
(Note that this module provides a Python version of the threading.local | |
class. Depending on the version of Python you're using, there may be a | |
faster one available. You should always import the `local` class from | |
`threading`.) | |
Thread-local objects support the management of thread-local data. | |
If you have data that you want to be local to a thread, simply create | |
a thread-local object and use its attributes: | |
>>> mydata = local() | |
>>> mydata.number = 42 | |
>>> mydata.number | |
42 | |
You can also access the local-object's dictionary: | |
>>> mydata.__dict__ | |
{'number': 42} | |
>>> mydata.__dict__.setdefault('widgets', []) | |
[] | |
>>> mydata.widgets | |
[] | |
What's important about thread-local objects is that their data are | |
local to a thread. If we access the data in a different thread: | |
>>> 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] | |
we get different data. Furthermore, changes made in the other thread | |
don't affect data seen in this thread: | |
>>> mydata.number | |
42 | |
Of course, values you get from a local object, including a __dict__ | |
attribute, are for whatever thread was current at the time the | |
attribute was read. For that reason, you generally don't want to save | |
these values across threads, as they apply only to the thread they | |
came from. | |
You can create custom local objects by subclassing the local class: | |
>>> class MyLocal(local): | |
... number = 2 | |
... initialized = False | |
... def __init__(self, **kw): | |
... if self.initialized: | |
... raise SystemError('__init__ called too many times') | |
... self.initialized = True | |
... self.__dict__.update(kw) | |
... def squared(self): | |
... return self.number ** 2 | |
This can be useful to support default values, methods and | |
initialization. Note that if you define an __init__ method, it will be | |
called each time the local object is used in a separate thread. This | |
is necessary to initialize each thread's dictionary. | |
Now if we create a local object: | |
>>> mydata = MyLocal(color='red') | |
Now we have a default number: | |
>>> mydata.number | |
2 | |
an initial color: | |
>>> mydata.color | |
'red' | |
>>> del mydata.color | |
And a method that operates on the data: | |
>>> mydata.squared() | |
4 | |
As before, we can access the data in a separate thread: | |
>>> log = [] | |
>>> thread = threading.Thread(target=f) | |
>>> thread.start() | |
>>> thread.join() | |
>>> log | |
[[('color', 'red'), ('initialized', True)], 11] | |
without affecting this thread's data: | |
>>> mydata.number | |
2 | |
>>> mydata.color | |
Traceback (most recent call last): | |
... | |
AttributeError: 'MyLocal' object has no attribute 'color' | |
Note that subclasses can define slots, but they are not thread | |
local. They are shared across threads: | |
>>> class MyLocal(local): | |
... __slots__ = 'number' | |
>>> mydata = MyLocal() | |
>>> mydata.number = 42 | |
>>> mydata.color = 'red' | |
So, the separate thread: | |
>>> thread = threading.Thread(target=f) | |
>>> thread.start() | |
>>> thread.join() | |
affects what we see: | |
>>> mydata.number | |
11 | |
>>> del mydata | |
CLASSES | |
_localbase(__builtin__.object) | |
local | |
class local(_localbase) | |
| Method resolution order: | |
| local | |
| _localbase | |
| __builtin__.object | |
| | |
| Methods defined here: | |
| | |
| __del__(self) | |
| | |
| __delattr__(self, name) | |
| | |
| __getattribute__(self, name) | |
| | |
| __setattr__(self, name, value) | |
| | |
| ---------------------------------------------------------------------- | |
| Data descriptors defined here: | |
| | |
| __dict__ | |
| dictionary for instance variables (if defined) | |
| | |
| __weakref__ | |
| list of weak references to the object (if defined) | |
| | |
| ---------------------------------------------------------------------- | |
| Static methods inherited from _localbase: | |
| | |
| __new__(cls, *args, **kw) | |
DATA | |
__all__ = ['local'] | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment