为什么在python线程中监视键盘中断不起作用

时间:2015-06-18 14:21:24

标签: python multithreading

我有一个非常简单的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'时,线程没有停止。有人可以解释我做错了什么。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

简单的理由:

  

因为只有 <_MainThread(MainThread, started 139712048375552)> 可以创建信号处理程序并监听信号。

这包括KeyboardInterrupt这是一个SIGINT。

直接来自signal文档:

  

如果使用信号和线程,必须要小心   同样的计划。使用信号和记忆时要记住的基本要点   线程同时是:始终执行signal()操作   主要执行线程。任何线程都可以执行alarm(),   getsignal(),pause(),setitimer()或getitimer();只有主线程   可以设置一个新的信号处理程序,主线程将是唯一的一个   接收信号(这是由Python信号模块强制执行的,甚至   如果底层线程实现支持发送信号   个别线程)。这意味着信号不能用作手段   线程间通信。改为使用锁。

相关问题