使用线程时Ctrl-C不起作用。计时器

问题描述:

我正在Windows上编写一个多线程的Python应用程序。使用线程时Ctrl-C不起作用。计时器

我曾经使用ctrl-c来终止应用程序,但是一旦我添加threading.Timer实例ctrl-c停止工作(或者有时需要很长时间)。

这怎么可能?
有定时器线程和ctrl-c之间的关系是什么?

UPDATE:
我发现Python的thread documentation如下:一个KeyboardInterrupt 异常将通过 任意线程接收:

线程与 中断奇怪的交互。 (当信号 模块可用,总是中断 去主线程。)

+0

是否有可能将代码粘贴到此处? – Rahul

的方式threading.Thread(因此threading.Timer)工作原理是,每个线程自己注册到threading模块,并在解释退出解释器将等待所有已注册的线程退出,然后终止解释器。这样做是为了让线程实际上完成执行,而不是让解释器在其下面被粗暴地移除。所以当你点击^ C时,主线程收到信号,决定终止并等待定时器结束。

您可以设置线程(与setDaemon方法)使线程模块不是等待这些线程,但如果他们碰巧被执行Python代码,而解释退出,你退出的过程会比较混乱的错误。即使您取消threading.Timer(并将其设置为守护进程),它仍然可以在解释器被销毁时唤醒 - 因为threading.Timercancel方法只是告知threading.Timer它在唤醒时不执行任何操作,但它必须实际执行Python代码来做出决定。

没有优雅的方式来终止线程(除了当前的线程),也没有可靠的方法来中断被阻塞的线程。定时器更易于管理的方法通常是事件循环,就像GUI和其他事件驱动系统为您提供的那样。使用什么完全取决于你的程序会做什么

+0

谢谢你的观点。暂时我标记了解决问题的线程守护进程,但是我想在某些时候我必须重构才能有适当的终止流程。 – Jonathan

+0

如果定时器设置在同一个线程中,信号处理程序是否会执行?如果是这样,如果一个timer.Cancel可以在信号处理程序中设置,现在该进程可以退出吗? – Vivek

+0

+1。有没有解释为什么有一些资源*“没有优雅的方式来终止线程(除了当前的线程),并且没有可靠的方法来中断被阻塞的线程”*? – n611x007

David Beazley介绍了这个话题。该PDF可用here。浏览第22--25页(“插曲:信号”到“冻结信号”)。

+0

这真的是一个有洞察力的PDF! – Jonathan