使用线程时Ctrl-C不起作用。计时器
问题描述:
我正在Windows上编写一个多线程的Python应用程序。使用线程时Ctrl-C不起作用。计时器
我曾经使用ctrl-c
来终止应用程序,但是一旦我添加threading.Timer
实例ctrl-c
停止工作(或者有时需要很长时间)。
这怎么可能?
有定时器线程和ctrl-c
之间的关系是什么?
UPDATE:
我发现Python的thread documentation如下:一个KeyboardInterrupt 异常将通过 任意线程接收:
线程与 中断奇怪的交互。 (当信号 模块可用,总是中断 去主线程。)
答
的方式threading.Thread
(因此threading.Timer
)工作原理是,每个线程自己注册到threading
模块,并在解释退出解释器将等待所有已注册的线程退出,然后终止解释器。这样做是为了让线程实际上完成执行,而不是让解释器在其下面被粗暴地移除。所以当你点击^ C时,主线程收到信号,决定终止并等待定时器结束。
您可以设置线程邪(与setDaemon
方法)使线程模块不是等待这些线程,但如果他们碰巧被执行Python代码,而解释退出,你退出的过程会比较混乱的错误。即使您取消threading.Timer
(并将其设置为守护进程),它仍然可以在解释器被销毁时唤醒 - 因为threading.Timer
的cancel
方法只是告知threading.Timer
它在唤醒时不执行任何操作,但它必须实际执行Python代码来做出决定。
没有优雅的方式来终止线程(除了当前的线程),也没有可靠的方法来中断被阻塞的线程。定时器更易于管理的方法通常是事件循环,就像GUI和其他事件驱动系统为您提供的那样。使用什么完全取决于你的程序会做什么。
是否有可能将代码粘贴到此处? – Rahul