diff -r 9e236a01e557 Lib/_threading_local.py --- a/Lib/_threading_local.py Wed Nov 04 08:38:12 2009 +0100 +++ b/Lib/_threading_local.py Wed Nov 04 21:20:30 2009 +0100 @@ -218,10 +218,13 @@ class local(_localbase): key = object.__getattribute__(self, '_local__key') try: - threads = list(threading.enumerate()) + # We can't call threading.enumerate() because it tries to take + # a lock which might already be taken (__del__ can be called at + # any point by the GC when collecting cycles). + threads = threading._active.values() + threading._limbo.values() except: - # If enumerate fails, as it seems to do during - # shutdown, we'll skip cleanup under the assumption + # If enumerating the current threads fails, as it seems to do + # during shutdown, we'll skip cleanup under the assumption # that there is nothing to clean up. return