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

J

Jerry Sievers

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
 
S

Steve Holden

Jerry said:
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.

regards
Steve
 
J

Jerry Sievers

Steve Holden said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

Forum statistics

Threads
473,995
Messages
2,570,226
Members
46,815
Latest member
treekmostly22

Latest Threads

Top