[Python-checkins] r45516 - python/trunk/Lib/_threading_local.py
tim.peters
python-checkins at python.org
Tue Apr 18 05:28:33 CEST 2006
Author: tim.peters
Date: Tue Apr 18 05:28:32 2006
New Revision: 45516
Modified:
python/trunk/Lib/_threading_local.py
Log:
Finally figured out why this module did its imports at the
bottom of the file. Restored that, and added a comment
explaining why this is necessary. Hint: on my box, and
yours, it's not :-(
Also added an __all__ list.
Modified: python/trunk/Lib/_threading_local.py
==============================================================================
--- python/trunk/Lib/_threading_local.py (original)
+++ python/trunk/Lib/_threading_local.py Tue Apr 18 05:28:32 2006
@@ -1,9 +1,9 @@
-"""Thread-local objects
+"""Thread-local objects.
-(Note that this module provides a Python version of thread
- 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.)
+(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
@@ -133,7 +133,17 @@
>>> del mydata
"""
-from threading import currentThread, RLock, enumerate
+__all__ = ["local"]
+
+# We need to use objects from the threading module, but the threading
+# module may also want to use our `local` class, if support for locals
+# isn't compiled in to the `thread` module. This creates potential problems
+# with circular imports. For that reason, we don't import `threading`
+# until the bottom of this file (a hack sufficient to worm around the
+# potential problems). Note that almost all platforms do have support for
+# locals in the `thread` module, and there is no circular import problem
+# then, so problems introduced by fiddling the order of imports here won't
+# manifest on most boxes.
class _localbase(object):
__slots__ = '_local__key', '_local__args', '_local__lock'
@@ -202,16 +212,13 @@
finally:
lock.release()
-
- # The default argument is a hack, to give __del__ a local name for
- # threading.enumerate (sidestepping problems with Python None'ing-out
- # module globals at shutdown time).
- def __del__(self, _threading_enumerate=enumerate):
+ def __del__(self):
+ import threading
key = object.__getattribute__(self, '_local__key')
try:
- threads = list(_threading_enumerate())
+ threads = list(threading.enumerate())
except:
# If enumerate fails, as it seems to do during
# shutdown, we'll skip cleanup under the assumption
@@ -230,3 +237,5 @@
del __dict__[key]
except KeyError:
pass # didn't have anything in this thread
+
+from threading import currentThread, RLock
More information about the Python-checkins
mailing list