无法使用 Ctrl-C 终止 Python 脚本
- 2024-10-17 08:47:00
- admin 原创
- 84
问题描述:
我正在使用以下脚本测试 Python 线程:
import threading
class FirstThread (threading.Thread):
def run (self):
while True:
print 'first'
class SecondThread (threading.Thread):
def run (self):
while True:
print 'second'
FirstThread().start()
SecondThread().start()
这是在 Kubuntu 11.10 上的 Python 2.7 中运行的。Ctrl
+C
不会杀死它。我还尝试添加系统信号的处理程序,但这没有帮助:
import signal
import sys
def signal_handler(signal, frame):
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
Ctrl
为了终止进程,我使用+将程序发送到后台,然后通过 PID 终止它Z
,而 + 不会被忽略。为什么Ctrl
+C
如此持续地被忽略?我该如何解决这个问题?
解决方案 1:
Ctrl
+C
终止主线程,但由于线程未处于守护进程模式,因此它们将继续运行,从而使进程保持活动状态。我们可以将它们设为守护进程:
f = FirstThread()
f.daemon = True
f.start()
s = SecondThread()
s.daemon = True
s.start()
但还有另一个问题 - 一旦主线程启动了线程,它就没有其他事情可做了。所以它退出了,线程立即被销毁。所以让我们保持主线程处于活动状态:
import time
while True:
time.sleep(1)
现在它将一直打印“first”和“second”,直到你按下Ctrl
“+”为止C
。
编辑:正如评论者指出的那样,守护线程可能没有机会清理临时文件之类的东西。如果需要,请KeyboardInterrupt
在主线程上捕获并让其协调清理和关闭。但在许多情况下,让守护线程突然死亡可能就足够了。
解决方案 2:
KeyboardInterrupt 和信号只能被进程(即主线程)看到...看看Ctrl-c 即 KeyboardInterrupt 在 python 中杀死线程
解决方案 3:
我认为最好join()
在预计线程会终止时调用它。我擅自更改了循环以使其结束(您也可以在此处添加所需的任何清理操作)。die
每次执行时都会检查变量,如果是True
,则程序退出。
import threading
import time
class MyThread (threading.Thread):
die = False
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run (self):
while not self.die:
time.sleep(1)
print (self.name)
def join(self):
self.die = True
super().join()
if __name__ == '__main__':
f = MyThread('first')
f.start()
s = MyThread('second')
s.start()
try:
while True:
time.sleep(2)
except KeyboardInterrupt:
f.join()
s.join()
解决方案 4:
@Thomas K 答案的改进版本:
is_any_thread_alive()
根据这个要点定义一个辅助函数,可以main()
自动终止。
示例代码:
import threading
def job1():
...
def job2():
...
def is_any_thread_alive(threads):
return True in [t.is_alive() for t in threads]
if __name__ == "__main__":
...
t1 = threading.Thread(target=job1,daemon=True)
t2 = threading.Thread(target=job2,daemon=True)
t1.start()
t2.start()
while is_any_thread_alive([t1,t2]):
time.sleep(0)
解决方案 5:
有一个简单的‘陷阱’需要警惕,你确定CAPS LOCK
没有吗?
我在 Pi4 上的 Thonny IDE 中运行 Python 脚本。CAPS LOCK
开启后,Ctrl
++Shift
会C
传递到键盘缓冲区,而不是Ctrl
+ C
。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件