什么是Python线程+ Unix信号语义?

Joe*_*haw 8 python unix multithreading posix signals

Python线程有哪些规则以及如何处理Unix信号?

KeyboardInterrupt,SIGINT由Python运行时内部触发但处理方式不同?

Joe*_*haw 9

首先,在使用signal模块设置信号处理程序时,必须在主线程中创建它们.如果您尝试在单独的线程中创建它们,您将收到异常.

通过该signal.signal()函数注册的信号处理程序将始终在主线程中调用.在支持向线程发送信号的体系结构上,在C级别,我相信Python运行时会忽略线程上的所有信号,并在主线程上有一个信号处理程序,它用于调度到Python代码信号处理程序.

thread模块的文档声明KeyboardInterrupt异常(通常由触发SIGINT)可以传递给任意线程,除非您有signal可用的模块,所有Unix系统都应该具有该模块.在这种情况下,它被传递到主线程.如果你没有系统signal,你必须抓住KeyboardInterrupt你的线程并调用thread.interrupt_main()在主线程中重新提升它.

更多信息可以在Python文档的发现threadsignal模块.