python:如何在主程序结束时终止线程
如果我有一个无限循环中的线程,有没有办法终止主程序结束时(例如,当我按ctrl+C
)?
检查这个问题。 正确的答案有很好的解释如何以正确的方式终止线程: 有什么办法杀死Python中的线程?
为了使线程在键盘中断信号(ctrl + c)上停止,可以在退出之前捕捉exception“KeyboardInterrupt”并清除。 喜欢这个:
try: start_thread() except (KeyboardInterrupt, SystemExit): cleanup_stop_thread() sys.exit()
这样,当程序突然终止时,您可以控制要执行的操作。
您也可以使用内置的信号模块,让您设置信号处理程序(在您的具体情况下SIGINT信号): http : //docs.python.org/library/signal.html
如果你让工作线程守护进程线程,当所有的非守护进程线程(例如主线程)退出时,它们将会死亡。
http://docs.python.org/library/threading.html#threading.Thread.daemon
使用Python标准库的atexit模块来注册在主线程的任何合理的“干净的”终止(包括未被捕获的exception,如KeyboardInterrupt
)上被调用(在主线程上)的“终止”函数。 这种终止function可能(虽然不可避免地在主线程中)调用任何你需要的stop
function; 以及将线程设置为daemon
的可能性,从而为您提供正确devise所需系统function的工具。
如果你像这样产生一个线程 – myThread = Thread(target = function)
– 然后执行myThread.start(); myThread.join()
myThread.start(); myThread.join()
。 当启动CTRL-C时,主线程不会退出,因为它正在等待阻塞myThread.join()
调用。 要解决这个问题,只需在.join()调用中放置一个超时。 超时可以只要你想。 如果你想要无限期的等待,只需要input一个很长的超时时间,比如99999. myThread.daemon = True
也是一个很好的习惯,所以所有线程在主线程(非守护进程)退出时退出。