Jon*_*han 6 python multithreading timer
我正在Windows上编写一个多线程Python应用程序.
我曾经使用过终止应用程序ctrl-c,但是一旦我添加了threading.Timer实例ctrl-c停止工作(或者有时需要很长时间).
怎么会这样?
具有Timer线程和ctrl-c?之间的关系是什么?
线程与中断奇怪地交互:KeyboardInterrupt异常将由任意线程接收.(当信号模块可用时,中断始终转到主线程.)
工作方式threading.Thread(因此threading.Timer)是每个线程向threading模块注册自己,并且在解释器退出时,解释器将等待所有已注册的线程退出,然后才能正确终止解释器。这样做是为了让线程真正完成执行,而不是将解释器从它们下面残酷地移除。因此,当您点击 ^C 时,主线程接收信号,决定终止并等待计时器完成。
您可以设置线程守护进程(使用该setDaemon方法)以使线程模块不等待这些线程,但是如果它们碰巧在解释器退出时执行 Python 代码,则在退出时会出现令人困惑的错误。即使您取消threading.Timer(并设置它为守护进程)它仍然可以在解释器被销毁时唤醒——因为threading.Timer的cancel方法只是告诉threading.Timer它在唤醒时不要执行任何操作,但它必须实际执行 Python 代码才能使那个决心。
没有优雅的方式来终止线程(当前线程除外),也没有可靠的方式来中断被阻塞的线程。更易于管理的计时器方法通常是事件循环,就像 GUI 和其他事件驱动系统为您提供的那样。使用什么完全取决于上还有什么你的程序会做。
| 归档时间: |
|
| 查看次数: |
3598 次 |
| 最近记录: |