Python 从信号处理程序调用时,sys.exit(1)不退出
我有一个信号处理器Python 从信号处理程序调用时,sys.exit(1)不退出,python,multithreading,Python,Multithreading,我有一个信号处理器 def signal_handler(signum, stack): do_something() sys.exit(1) 我是这样登记的: signal.signal(signal.SIGUSR1, signal_handler) 在进程运行期间,某些线程可能会调用os.kill(os.getpid(),signal.SIGUSR1) 因为我在程序的最开始就注册了这个信号,所以主线程可以获取这个信号并调用signal\u handler() 但是,sys
def signal_handler(signum, stack):
do_something()
sys.exit(1)
我是这样登记的:
signal.signal(signal.SIGUSR1, signal_handler)
在进程运行期间,某些线程可能会调用os.kill(os.getpid(),signal.SIGUSR1)
因为我在程序的最开始就注册了这个信号,所以主线程可以获取这个信号并调用signal\u handler()
但是,sys.exit(1)
实际上并不退出程序。我感觉程序回到了被信号中断的地方
我不明白为什么会这样。我想使用sys.exit
而不是os.\u exit
的原因是我想触发在atexit()中注册的函数
是否有任何方法可以从信号处理程序退出程序,并在退出时触发atexit()
。是否有什么东西捕获了SystemExit
异常?看起来Python 2和3中的atexit
模块都有\u run\u exitfuncs()
函数,因此,您可以手动调用它,然后调用os.\u exit()
。我不确定它是否真正记录了从信号处理程序中引发异常(包括SystemExit
)时发生的情况。信号处理程序在主线程的字节码之间的自己的堆栈上执行。另外,我注意到您将此标记为多线程。如果您实际上有非守护进程后台线程,sys.exit
将在退出之前有效地将它们全部加入中(至少在大多数实现和平台上;我认为在任何地方都没有记录到这一点)。A对我来说都非常有效。请将您的程序缩减为演示问题的最小程序,并将该程序复制粘贴到您的问题中。有关更多信息,请参阅。