threading and iterator crashing interpreter
Janto Dreijer
jantod at gmail.com
Sun Mar 11 08:47:34 EDT 2007
On Mar 11, 1:46 pm, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Sun, 11 Mar 2007 07:32:04 -0300, Janto Dreijer <jan... at gmail.com>
> escribió:
>
>
>
> > I have been having problems with the Python 2.4 and 2.5 interpreters
> > on both Linux and Windows crashing on me. Unfortunately it's rather
> > complex code and difficult to pin down the source.
>
> > So I've been trying to reduce the code. In the process it's started to
> > crash in different ways. I'm not sure if any of it is related. The
> > following is only crashing Python 2.5 (r25:51908, Sep 19 2006,
> > 09:52:17) [MSC v.1310 32 bit (Intel)] on win32 in two different(?)
> > ways.
>
> > ====================
>
> > Using the login1() function will throw a bunch of exceptions the most
> > interesting of which is:
>
> > Exception in thread Thread-34:
> > Traceback (most recent call last):
> > File "C:\Python25\lib\threading.py", line 460, in __bootstrap
> > self.run()
> > File "C:\Python25\lib\threading.py", line 440, in run
> > self.__target(*self.__args, **self.__kwargs)
> > File "Copy of scratchpad.py", line 20, in login1
> > random.choice(System.sessions).session_iter.next()
> > RuntimeError: instance.__dict__ not accessible in restricted mode
>
> From the error message, you appear to be using some form of restricted
> execution - RExec or similar. I didn't try that way, but using the normal
> mode, I got this different exception instead (using login1):
>
> Exception in thread Thread-85:
> Traceback (most recent call last):
> File "c:\apps\python\lib\threading.py", line 460, in __bootstrap
> self.run()
> File "c:\apps\python\lib\threading.py", line 440, in run
> self.__target(*self.__args, **self.__kwargs)
> File "crash.py", line 20, in login1
> random.choice(System.sessions).session_iter.next()
> ValueError: generator already executing
>
> It appears to indicate that you must syncronize the generators.
> Adding a Lock object to Session appears to work OK:
>
> class Session:
> def __init__(self):
> self.lock = Lock()
> self.session_iter = session_iter(self)
>
> def login1():
> # first interpreter
> System.sessions.append(Session())
> while 1:
> session = random.choice(System.sessions)
> session.lock.acquire()
> session.session_iter.next()
> session.lock.release()
>
> Your login2 version does not generate any error on my PC.
>
> --
> Gabriel Genellina
As far as I can tell I'm not running it from restricted mode
explicitly.
The reason I'm doing the random.choice() is so I don't have a handle
("session" in this case) that would prevent it from being garbage
collected. I am not bothered by the Python-level Exceptions. I am
bothered by the interpreter throwing a segfault. What I suspect is
happening is the Session object is deallocated, while it still has a
reference from within the iterator.
It's quite difficult to reproduce these bugs consistently. You might
need to run it a few times.
More information about the Python-list
mailing list