[Python-Dev] threading bug?

Guido van Rossum guido@python.org
Fri, 05 Oct 2001 15:09:43 -0400


> > > Unhandled exception in thread:
> > > Traceback (most recent call last):
> > >   File "c:\python21\lib\threading.py", line 393, in __bootstrap
> > >     self.__stop()
> > >   File "c:\python21\lib\threading.py", line 399, in __stop
> > >     self.__block.notifyAll()
> > >   File "c:\python21\lib\threading.py", line 235, in notifyAll
> > >     self.notify(len(self.__waiters))
> > >   File "c:\python21\lib\threading.py", line 217, in notify
> > >     me = currentThread()
> > > TypeError: object of type 'None' is not callable
> > > 
> > > This traceback does not appear when I register an atexit
> > > function to stop the thread.
> > > 
> > > Is this a bug? Aren't daemon threads supposed to clean up
> > > themselves?

> > This is probably a result of the destructive module finalization.
> > When Py_Finalize() is called, threads that are still running are not
> > killed.  But Py_Finalize() replaces the values of all globals in
> > modules with None (it could just clear the module's dictionary but
> > there was some reason for doing it this way) and that is what you are
> > probably seeing.
> > 
> > If there was a primitive to kill a thread, we might use it in
> > Py_Finalize() -- but there isn't (it's been requested but it's hard to
> > see how to do it safely).

> But it seems the system is trying to stop the thread(s),
> maybe too late. In my case, atexit.register(self.stop)
> makes a clean shutdown.
> My point is: should the threading module do this?
> I can easily live with doing it myself - I just don't know
> if this is intended or required.

Python doesn't attempt to stop daemon threads at all.  Note that the
__stop() call is in a finally clause.  This probably gets hit because
some other exception happened (caused by the same problem of globals
being replaced by None).

--Guido van Rossum (home page: http://www.python.org/~guido/)