# Windows-specific SSCCE: if KeyboardInterrupt occurs during Thread.join(), Thread.is_alive() will never return False. import os import signal import threading import time def raise_ctrl_c(): print('raising ctrl c') time.sleep(0.05) os.kill(0, signal.CTRL_C_EVENT) print('finishing') t = threading.Thread(target=raise_ctrl_c) t.start() while True: try: if t.is_alive(): print('waiting...') t.join(0.1) else: break except KeyboardInterrupt: print('KeyboardInterrupt caught and ignored') pass print('done!')