I read somewhere that KeyboardInterrupt
exception is only raised in the main thread in Python. I also read that the main thread is blocked while the child thread executes. So, does this mean that CTRL+C can never reach to the child thread. I tried the following code:
def main():
try:
thread = threading.Thread(target=f)
thread.start() # thread is totally blocking (e.g., while True)
thread.join()
except KeyboardInterrupt:
print "Ctrl+C pressed..."
sys.exit(1)
def f():
while True:
pass # do the actual work
In this case there is no effect of CTRL+C on the execution. It is like it is not able to listen to the signal. Am I understanding this the wrong way? Is there any other way to kill the thread using CTRL+C?
If you want to have main thread to receive the CTRL+C signal while joining, it can be done by adding timeout to join()
call.
The following seems to be working (don't forget to add daemon=True
if you want main to actually end):
thread1.start()
while True:
thread1.join(600)
if not thread1.isAlive():
break