thread; interrupt_main() doesn't seem to work?

Jerry Sievers jerry at jerrysievers.com
Mon Nov 22 00:22:08 CET 2004


Steve Holden <steve at holdenweb.com> writes:

> Jerry Sievers wrote:
> 
> > Fellow Pythonists; According to the docs
> > 
> > +-----------------+
> > |interrupt_main(|)|
> > +-----------------+
> > 
> >           Raise a KeyboardInterrupt in the main thread. A subthread can use
> >      this function to interrupt the main thread. New in version 2.3.
> > 
> > Therefore, I was expecting this short test prog to run and then finish
> > with the KeyboardInterrupt exception at the bottom in the pause
> > routine.  It doesn't stop there but I can do a manual keyboard
> > interrupt and get the expected bactrace and program exit.
> > 
> > ---
> > 
> > from signal import pause
> > from socket import socket
> > from thread import start_new_thread, interrupt_main
> > from time import sleep
> > 
> > def go():
> >     print 'go'
> >     while f.readline():
> >         print 'line'
> >     print 'empty'
> >     interrupt_main()
> >     print 'done'
> > 
> > s = socket()
> > s.connect(('localhost', 80))
> > f = s.makefile()
> > print 'connected'
> > 
> > start_new_thread(go, ())
> > 
> > sleep(2)
> > s.shutdown(2)
> > pause()  # expecting to get KeyboardInterrupt exception here
> > 
> > ---
> > 
> > connected
> > go
> > empty
> > done
> > ....hangs here as if interrupt_main() does nothing.
> > 
> > Manual Control-C required to wake up from pause() and exit.
> > 
> > Traceback (most recent call last):
> >   File "test.py", line 23, in ?
> >     pause()  # expecting to get KeyboardInterrupt exception here
> > KeyboardInterrupt
> > 
> > Python 2.3.3 on RedHat 7x.
> > 
> > Wondering what's wrong?
> > 
> > Thanks
> > 
> > 
> Perhaps the main thread has to actually be running to respond to the 
> raised exception. Did you try a shortish sleep() instead of the pause? 
> That would at least test this theory.

Sure did.  Tested with  the main prog blocked on raw_input() and also
sleeping(someNum)...

But you did hit on the problem when you said 'running'.

I kept testing and found it to work  in the following test case;

While True:
	sleep(1)
	# the exception gets noticed here
	doSomething()

This is a little curious since a real KeyboardInterrupt does get
noticed and processed immediatly whereas the one thrown from the
interrupt_main() routine doesn't get noticed until "between"
instructions.

In other words, I can interrupt a pause() at any time by hitting
Control-C but not by calling interrupt_main().

Thank you


-- 
-------------------------------------------------------------------------------
Jerry Sievers   305 854-3001 (home)     WWW ECommerce Consultant
                305 321-1144 (mobile	http://www.JerrySievers.com/



More information about the Python-list mailing list