I've run into strange behavior involving a blocking call to a socket accept() 
on the main thread and thread.interrupt_main() being called on a worker thread. 
 Here's my code:

# BEGIN exception_test.py
import socket
import thread
import threading
import time


def worker():
    time.sleep(2)
    print 'Interrupting main'
    thread.interrupt_main()
    print 'main interrupted!'

sock = socket.socket()
sock.bind(('127.0.0.1', 8080))
sock.settimeout(5)
sock.listen(0)

t = threading.Thread(target=worker)
t.start()

try:
    connection, _ = sock.accept()
except KeyboardInterrupt:
    print 'KeyboardInterrupt!'
except socket.timeout:
    print 'Socket timeout!'

print 'exiting'

# END exception_test.py

I would expect this output:

Interrupting main
main interrupted!
KeyboardInterrupt caught!
exiting

But instead, I'm seeing this:

Interrupting main
main interrupted!
Traceback (most recent call last):
  File "exception_test.py", line 23, in <module>
    connection, _ = sock.accept()
KeyboardInterrupt

Despite my "except KeyboardInterrupt", the KeyboardInterrupt forced by the 
thread.interrupt_main() in the worker thread isn't being caught.

Other things worth noting is that the exception takes about 3 seconds after the 
call to thread.interrupt_main().  It appears to not actually happen until the 
sock.accept() times out.  If the call to sock.settimeout(5) is removed, the 
KeyboardInterrupt never appears and flow is still blocked on the sock.accept().

My Python version is 2.7.3.  I know its out of date, but I don't really have a 
choice.
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to