我有一个非常简单的python代码:
def monitor_keyboard_interrupt():
is_done = False
while True:
if is_done
break
try:
print(sys._getframe().f_code.co_name)
except KeyboardInterrupt:
is_done = True
def test():
monitor_keyboard_thread = threading.Thread(target = monitor_keyboard_interrupt)
monitor_keyboard_thread.start()
monitor_keyboard_thread.join()
def main():
test()
if '__main__' == __name__:
main()
然而,当我按下'Ctrl-C'时,线程没有停止。有人可以解释我做错了什么。任何帮助表示赞赏。
答案 0 :(得分:3)
简单的理由:
因为只有
<_MainThread(MainThread, started 139712048375552)>
可以创建信号处理程序并监听信号。
这包括KeyboardInterrupt
这是一个SIGINT。
直接来自signal文档:
如果使用信号和线程,必须要小心 同样的计划。使用信号和记忆时要记住的基本要点 线程同时是:始终执行signal()操作 主要执行线程。任何线程都可以执行alarm(), getsignal(),pause(),setitimer()或getitimer();只有主线程 可以设置一个新的信号处理程序,主线程将是唯一的一个 接收信号(这是由Python信号模块强制执行的,甚至 如果底层线程实现支持发送信号 个别线程)。这意味着信号不能用作手段 线程间通信。改为使用锁。