导入和使用包时,此包可以运行非守护程序线程。在这些线程完成之前,python无法正常退出(与sys.exit(0)一样)。例如,假设线程t来自某个包。当主线程中发生未处理的异常时,您希望终止。但是这不会立即退出,它将等待60秒直到线程终止。
import time, threading
def main():
t = threading.Thread(target=time.sleep, args=(60,))
t.start()
a = 5 / 0
if __name__ == '__main__':
try:
main()
except:
sys.exit(1)
所以我想出了两件事。用os._exit(1)替换sys.exit(1)或枚举所有线程并使它们成为守护进程。它们似乎都有效,但你的情况更好吗? os._exit不会刷新stdio缓冲区,但是将守护进程属性设置为线程似乎是一个黑客攻击,也许它不能保证一直工作。
import time, threading
def main():
t = thread.Thread(target=time.sleep, args=(60,))
t.start()
a = 5 / 0
if __name__ == '__main__':
try:
main()
except:
for t in threading.enumerate():
if not t.daemon and t.name != "MainThread":
t._daemonic = True
sys.exit(1)