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