检测解释器在守护程序线程中关闭

时间:2013-08-07 08:33:12

标签: python multithreading

我们遇到了这个错误:

http://bugs.python.org/issue1856守护程序在解释器关闭期间断言段错误。

现在我搜索一种代码来解决这个bug。

目前代码如下:

while True:
    do_something()
    time.sleep(interval)

有没有办法在do_something()之前检查解释器是否仍然可用?

或者最好不要执行mythread.setDaemon(True)并检查主线程是否已退出?

2 个答案:

答案 0 :(得分:6)

回答自己的问题:

我现在使用这个模式:不要setDaemon(True),不要使用sleep(),使用parent_thread.join()

while True:
    parent_thread.join(interval)
    if not parent_thread.is_alive():
        break
    do_something()

相关:http://docs.python.org/2/library/threading.html#threading.Thread.join

答案 1 :(得分:0)

这是来自 threading.py 模块的代码:

import sys as _sys

class Thread(_Verbose):
    def _bootstrap_inner(self):
        # some code

            # If sys.stderr is no more (most likely from interpreter
            # shutdown) use self._stderr.  Otherwise still use sys (as in
            # _sys) in case sys.stderr was redefined since the creation of
            # self.
            if _sys:
               _sys.stderr.write("Exception in thread %s:\n%s\n" % 
                   (self.name, _format_exc()))
            else:
               # some code

可能会有所帮助。您看到的错误来自else声明。所以在你的情况下:

import sys as _sys

while True:
    if not _sys:
        break/return/die/whatever
    do_something()
    time.sleep(interval)

我不确定它是否有效(注意解释器关闭可能发生在do_something内,所以你应该用try:except:包装所有内容。

守护程序线程不一定是坏的,它们肯定可以加快开发过程。你只需要小心它们。