我正在 Windows 上编写一个多线程 Python 应用程序。
我曾经使用终止应用程序ctrl-c
,但是一旦我添加了threading.Timer
实例ctrl-c
停止工作(或有时需要很长时间)。
怎么会这样?
拥有 Timer 线程和之间有什么关系ctrl-c
?
UPDATE:
我在Python中发现了以下内容线程文档 http://docs.python.org/library/thread.html:
线程奇怪地交互
中断:键盘中断
异常将被接收到
任意线程。 (当信号
模块可用,中断始终
转到主线程。)
The way threading.Thread
(因此threading.Timer
)的工作原理是每个线程将自己注册到threading
模块,并且在解释器退出时,解释器将等待所有注册的线程退出,然后再终止解释器。这样做是为了让线程真正完成执行,而不是将解释器从它们下面残酷地删除。因此,当您点击 ^C 时,主线程会收到信号,决定终止并等待计时器完成。
可以设置线程daemonic(与setDaemon
方法)使线程模块不等待这些线程,但如果它们在解释器退出时恰好正在执行Python代码,那么在退出期间您会遇到令人困惑的错误。即使你取消了threading.Timer
(并将其设置为守护进程)当解释器被销毁时它仍然可以唤醒 - 因为threading.Timer
's cancel
方法只是告诉threading.Timer
当它醒来时不执行任何操作,但它必须实际执行 Python 代码才能做出该决定。
没有优雅的方法来终止线程(当前线程除外),也没有可靠的方法来中断被阻塞的线程。更易于管理的计时器方法通常是事件循环,就像 GUI 和其他事件驱动系统为您提供的那样。使用什么完全取决于还有什么你的程序将会执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)