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

13

我们遭受了这个bug的影响:

http://bugs.python.org/issue1856 守护线程在解释器关闭期间崩溃。

现在我在寻找解决这个问题的方法。

目前代码看起来是这样的:

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

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

还是不设置mythread.setDaemon(True),然后检查主线程是否已退出更好?


1
相关:https://dev59.com/uWQn5IYBdhLWcg3wkH3U - guettli
2个回答

10

我不明白。如果一个子线程不是守护线程,那么父线程永远不会死亡(在子线程之前),因此父线程上的 is_alive 始终为真。也就是说,这个检查完全没有意义。如果子线程是守护线程,则可能起作用。 - freakish
1
@freakish 如果父(主)线程已经结束,is_alive() 将返回 False,但子线程仍然存活。在我的测试中它有效。 - guettli
@guettli 你好,我这里也遇到了类似的问题。你能否解释一下你是如何获取 parent_thread 的吗? - Korem
@Korem 我将 parent_thread 存储在模块级别。在我的情况下,整个进程/解释器只有一个父线程。 - guettli
我发现一个类似的问题,我的 curses 屏幕接口是一个线程,其余所有内容都是主线程。退出是由子线程发起的(按下“q”)- 这在 Linux 上导致了 segfault - 我将尝试这个解决方案 - 感谢您的发布! - kollery

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:包装起来)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接