在Python中打印守护线程异常
Python不会打印来自守护进程线程中引发的异常的回溯消息 例如,此代码创建守护线程并在新线程中引发异常:在Python中打印守护线程异常,python,multithreading,Python,Multithreading,Python不会打印来自守护进程线程中引发的异常的回溯消息 例如,此代码创建守护线程并在新线程中引发异常: def error_raiser(): raise Exception import threading thread = threading.Thread(target=error_raiser) thread.daemon = True thread.start() 但不打印回溯。(它没有输出) 但是,如果该线程未设置为守护进程线程,Python将打印回溯。以下是注释掉一行
def error_raiser():
raise Exception
import threading
thread = threading.Thread(target=error_raiser)
thread.daemon = True
thread.start()
但不打印回溯。(它没有输出)
但是,如果该线程未设置为守护进程线程,Python将打印回溯。以下是注释掉一行的相同代码:
def error_raiser():
raise Exception
import threading
thread = threading.Thread(target=error_raiser)
# thread.daemon = True
thread.start()
以及输出:
Exception in Thread-1:
Traceback (most recent call last):
File "C:\Python26\lib\threading.py", line 525, in __bootstrap_inner
self.run()
File "C:\Python26\lib\threading.py", line 477, in run
self.__target(*self.__args, **self.__kwargs)
File "test.py", line 2, in error_raiser
raise Exception
Exception
在Python2.6.2和Python3.0.1中执行此代码,并给出相同的结果。然而,有趣的是,如果我通过在ipythonshell中导入代码来执行代码,那么无论线程是否是守护线程,都会显示异常
根据文档,“守护进程”标志的唯一意义是“当只剩下守护进程线程时,整个Python程序就会退出”。这让我相信,在异常后不打印回溯是Python中的一个错误,除非我在文档中遗漏了什么
这是一个bug,还是我在文档中遗漏了什么,而这种行为是故意的?如果是有意的,我如何强制Python在不使用IPython的情况下在守护进程线程中打印回溯?根据Wikipedia的定义,守护进程应该从控制tty中分离出来,因此我认为没有显示异常是正确的(毕竟,即使关闭启动它的shell,守护进程也应该继续工作)..
看 至于如何打印回溯,我认为一个简单的try/except\u then\u log\u to\u文件就可以了:) 这是一个bug,还是我在文档中遗漏了什么,而这种行为是故意的 你自己基本上已经说明了原因,但没有意识到: 根据文档,“守护进程”标志的唯一意义是“当只剩下守护进程线程时,整个Python程序将退出。” 如果您有一个非守护线程,Python将在
thread.start()之后等待它。这种等待包括它所做的任何事情,包括引发和处理异常
如果有守护线程,Python不会在thread.start()之后等待它。相反,在没有进一步说明的情况下,Python会立即退出。这意味着您的线程永远没有机会引发或处理异常
如果是有意的,我如何强制Python在不使用IPython的情况下在守护进程线程中打印回溯
对于守护进程
线程,线程应该做什么无关紧要。如果它被指示打印一些东西,同样的情况也会发生
这也意味着您无法有条件地等待守护进程的操作。您可以设置thread.daemon=False
并获取所有回溯,以及所有打印、I/O和其他操作。或者设置thread.daemon=True
,在所有其他线程都死机后,不会得到回溯,也不会得到打印、I/O或其他操作
然而,有趣的是,如果我通过在ipythonshell中导入代码来执行代码,那么无论线程是否是守护线程,都会显示异常
贝壳的问题是,除非你杀死它们,否则它们永远不会离开。由于shell的解释器在等待您的输入时不会退出,因此任何启动的守护进程线程都会保持活动状态。您的解决方案非常适合打印回溯。我没有想到尝试……只是因为我依赖Python来为我进行打印。顺便说一下,根据文档,我相信daemonic线程在程序退出时终止,而不仅仅是分离。谢谢你的帮助!