Bugs item #1562822, was opened at 2006-09-21 04:59
Message generated for change (Comment added) made by josiahcarlson
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1562822&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Threads
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Jaster (steevel)
Assigned to: Nobody/Anonymous (nobody)
Summary: decimal module borks thread

Initial Comment:
I got across this while trying to use MySQLdb in a
thread. Since MySQLdb imports decimal I got the same
error there.

Code: (This happens in both 2.4 and 2.5)

import thread, time, sys
if len(sys.argv) > 1:
   import threading

def test ():
   import decimal
   print 'Exiting test.'

thread.start_new_thread(test, ())
time.sleep(1)


Output:
$ ./thread.py 1
Exiting test.

$ ./thread.py
Exiting test.
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "/usr/local/python2.5/lib/python2.5/atexit.py",
line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File
"/usr/local/python2.5/lib/python2.5/threading.py", line
656, in __exitfunc
    self._Thread__delete()
  File
"/usr/local/python2.5/lib/python2.5/threading.py", line
540, in __delete
    del _active[_get_ident()]
KeyError: -1209698640
Error in sys.exitfunc:
Traceback (most recent call last):
  File "/usr/local/python2.5/lib/python2.5/atexit.py",
line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File
"/usr/local/python2.5/lib/python2.5/threading.py", line
656, in __exitfunc
    self._Thread__delete()
  File
"/usr/local/python2.5/lib/python2.5/threading.py", line
540, in __delete
    del _active[_get_ident()]
KeyError: -1209698640

----------------------------------------------------------------------

Comment By: Josiah Carlson (josiahcarlson)
Date: 2006-09-22 13:25

Message:
Logged In: YES 
user_id=341410

It's not so much that you can't import in a thread, it's
that you can't import in a thread when the importer is
running in another thread.

When you run a module via 'python module.py', Python
compiles that module into bytecode, then imports the module,
which results in the module being executed.  The execution
of the module performs the various imports, function
definitions, class definitions, etc.  When you start up a
thread while the module is being imported, the import lock
doesn't know what to do and bails out, leaving you with the
situation you are having.

Try rewriting your module like:
import thread
import time
import decimal

def test():
    import decimal
    print "exiting test"

def main():
    thread.start_new_thread(test, ())
    time.sleep(1)

Then running it via:
    python -c "import tmodule;tmodule.main()"

And really, aside from "importing in a thread can be
troublesome, if you don't know what you are doing, don't do
it", what kind of documentation change would you suggest,
and where would it go?

----------------------------------------------------------------------

Comment By: Jaster (steevel)
Date: 2006-09-22 10:56

Message:
Logged In: YES 
user_id=1117967

I don't get this interface. Why can't I post a comment?
To josiahcarlson: The program I'm currently writing is
module based and I don't know what python modules my users
will import. It shouldn't matter tho, either this is a "bug"
or it needs to go in the documentation that you can't import
them in a thread if you havent already imported them before.

----------------------------------------------------------------------

Comment By: Josiah Carlson (josiahcarlson)
Date: 2006-09-21 20:48

Message:
Logged In: YES 
user_id=341410

I believe it is an issue with the import lock.

If you 'import decimal' prior to starting up your subthread,
everything will run fine.

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1562822&group_id=5470
_______________________________________________
Python-bugs-list mailing list 
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to