【发布时间】:2021-12-23 11:15:32
【问题描述】:
我正在尝试这个带有 while 循环的简单线程。当我在 while 循环中时,Ctrl+C 无法停止我的程序。一旦我在 while 循环之后做其他事情,脚本就会按预期停止。我该怎么做才能让我的脚本在 while 循环中和之后被优雅地杀死? (编辑:这似乎是 Windows 独有的问题,iOS 和 Ubuntu 似乎可以满足我的要求)
import time, threading
class MainClass(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
while True:
time.sleep(1)
print("Looping")
# Script entry point
if __name__ == '__main__':
a = MainClass()
a.daemon = True
a.start()
a.join()
【问题讨论】:
-
什么 Python3 版本?什么操作系统?如果我运行您的示例,它会不断打印“循环”,直到我按下 Ctrl+C。然后它转储堆栈(KeyboardInterrupt)并退出。我在 MacOS 上运行 Python 3.8.9。
-
另外,“按预期停止”和“优雅地杀死”是什么意思?有人可能会说转储堆栈并不“优雅”。
-
我在 Windows 上运行 python 3.7.5(在虚拟环境中,但在它之外做同样的事情)。对我来说,它只是一直打印“循环”,直到我用任务管理器杀死它,因为 Ctrl+C 根本没有任何效果。 “优雅地”我的意思是不要留下任何僵尸线程,我不介意转储堆栈,我只是希望每个线程都停止(我将在这个线程中使用一些多处理,所以我想确保一切都停止一旦我按下 Ctrl+C 就死了)
标签: python-3.x windows multithreading sigkill