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"时,线程不会停止.有人可以解释我做错了什么.任何帮助表示赞赏.
原因很简单:
\n\n\n\n\n因为只有
\n<_MainThread(MainThread, started 139712048375552)>可以创建信号处理程序并侦听信号。
这包括KeyboardInterruptSIGINT。
这直接来自信号文档:
\n\n\n\n如果在同一程序中同时使用信号和线程,则必须小心。同时使用信号和线程时要记住的基本事情是:始终在执行的主线程中执行 signal() 操作。任何线程都可以执行alarm()、getsignal()、pause()、setitimer() 或getitimer();只有主线程可以设置新的信号处理程序,并且主线程将是唯一接收信号的线程(这是由 Python 信号模块强制执行的,即使底层线程实现支持将信号发送到n 个单独的线程)。这意味着信号不能用作线程间通信的手段。请改用锁。
\n