Asking for Help: I'm taking an unhandled threading exception that I've been unable to locate

I keep getting this unhandled exception, but I believe I have placed try except statements in all my threads. Any thoughts?

Unhandled exception in thread started by <bound method Thread.__bootstrap of <Thread(Thread-169204, stopped 1004)>>
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 503, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 518, in __bootstrap_inner
    del _limbo[self]
KeyError: <Thread(Thread-169204, stopped 1004)>

A philosophical discussion appears to be appropriate here. How in fact does one get one's self out of _limbo? The answer my friend is blowing in the wind. The answer is ...

Posted this question about a week ago and noone has answered. Not sure if anyone is paying attention to the Asking for Help portion of the wiki. Just to make sure that I know exactly how long its been on the wiki today's date is 3/22/2011. The wiki indicated that my question was sent to MatsWichmann, SkipMontanaro, FredDrake. Do these guys really exist?

Yes, I really exist. So do Fred and Mats. (I have even met Fred before.) I subscribe to all pages of the wiki mostly to revert spam introduced into it, not to answer questions. Personally, of all the uses one could think of for a wiki, asking and answering long-form help questions seems to me like just about the worst use possible. I ignore essentially all questions posted here unless it looks like someone is spamming this subtree of the wiki. -- SkipMontanaro

Those guys get mails about updates to this page, yes. I did have a look at the threading module, but I have to admit that I am not really familiar with its architecture. There's a comment in the __bootstrap method which claims that exceptions thrown by "daemon threads" are meant to be ignored, but it looks like you're experiencing a problem with the actual administration of threads done by the module itself - that is, you aren't supposed to be concerned by the _limbo dictionary - and maybe there's a bug involved. I can only find 7264 which mentions _limbo, however. -- PaulBoddie 2011-03-22 22:55:34

Skip and Paul,

Thanks for responding. Is there a better place to post my question? Where might that be?

Check out the links at the top of the Asking for Help page. I think it's helpful to have some kind of archive of questions and answers here, although I didn't start this activity, but unfortunately there aren't many people reading the questions, I'm afraid. I would try the regular Python mailing list, maybe filing a bug if this is in some program where you're doing the right thing. You may have to share a bit of your code to have people help you, however. People really like to have the essence of a problem demonstrated in as short a program as possible. Feel free to use this page to communicate your problem if it's convenient, though, if you need to post some code somewhere and you don't think your e-mail program or newsreader is keeping it readable, for example. -- PaulBoddie 2011-03-24 22:17:33

This patch seems to work for me. I will also post to the bugs list.

--- threading27.py      Mon Apr 05 20:23:34 2010
+++ threadingmod27.py   Tue Mar 29 10:16:59 2011
@@ -439,6 +439,7 @@
         self.__stopped = False
         self.__block = Condition(Lock())
         self.__initialized = True
+        self.isSelfInLimbo = True
         # sys.stderr is not stored in the class like
         # sys.exc_info since it can be changed between instances
         self.__stderr = _sys.stderr
@@ -484,7 +485,9 @@
         finally:
             # Avoid a refcycle if the thread is running a function with
             # an argument that has a member that points to the thread.
-            del self.__target, self.__args, self.__kwargs
+            if not self.isSelfInLimbo:
+                self.isSelfInLimbo = True
+                del self.__target, self.__args, self.__kwargs
 
     def __bootstrap(self):
         # Wrapper around the real bootstrap code that ignores
@@ -515,7 +518,10 @@
             self.__started.set()
             with _active_limbo_lock:
                 _active[self.__ident] = self
-                del _limbo[self]
+                if self in _limbo:
+                    del _limbo[self]
+                else:
+                    self.isSelfInLimbo = False
             if __debug__:
                 self._note("%s.__bootstrap(): thread started", self)


CategoryAskingForHelp CategoryAskingForHelpAnswered

Asking for Help/I'm taking an unhandled threading exception that I've been unable to locate (last edited 2011-03-31 20:02:24 by PaulBoddie)