threading ignores KeyboardInterrupt exception
Try
try: thread=reqthread() thread.daemon=True thread.start() while True: time.sleep(100)except (KeyboardInterrupt, SystemExit): print '\n! Received keyboard interrupt, quitting threads.\n'
Without the call to time.sleep
, the main process is jumping out of the try...except
block too early, so the KeyboardInterrupt
is not caught. My first thought was to use thread.join
, but that seems to block the main process (ignoring KeyboardInterrupt) until the thread
is finished.
thread.daemon=True
causes the thread to terminate when the main process ends.
To summarize the changes recommended in the comments, the following works well for me:
try: thread = reqthread() thread.start() while thread.isAlive(): thread.join(1) # not sure if there is an appreciable cost to this.except (KeyboardInterrupt, SystemExit): print '\n! Received keyboard interrupt, quitting threads.\n' sys.exit()
Slight modification of ubuntu's solution.
Removing tread.daemon = True as suggested by Eric and replacing the sleeping loop by signal.pause():
import signaltry: thread=reqthread() thread.start() signal.pause() # instead of: while True: time.sleep(100)except (KeyboardInterrupt, SystemExit): print '\n! Received keyboard interrupt, quitting threads.\n'