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

fla*_*urn 5 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()
Run Code Online (Sandbox Code Playgroud)

但是,当我按下"Ctrl-C"时,线程不会停止.有人可以解释我做错了什么.任何帮助表示赞赏.

Jam*_*lls 4

原因很简单:

\n\n
\n

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

\n
\n\n

这包括KeyboardInterruptSIGINT。

\n\n

这直接来自信号文档:

\n\n
\n

如果在同一程序中同时使用信号和线程,则必须小心。同时使用信号和线程时要记住的基本事情是:始终在执行的主线程中执行 signal() 操作。任何线程都可以执行alarm()、getsignal()、pause()、setitimer() 或getitimer();只有主线程可以设置新的信号处理程序,并且主线程将是唯一接收信号的线程(这是由 Python 信号模块强制执行的,即使底层线程实现支持将信号发送到n 个单独的线程)。这意味着信号不能用作线程间通信的手段。请改用锁。

\n
\n